iOS: obtenga la orientación de la pantalla después de deshabilitar la rotación de la pantalla

pregunta:

Este escenario empresarial se describe de la siguiente manera: el proyecto en sí admite pantallas horizontales y verticales, pero la dirección del VC debe estar deshabilitada bajo un ViewController específico, es decir, no es sensible a la rotación de la pantalla; pero también debe poder obtener la dirección de la pantalla actual

Al principio pensé que sería suficiente reescribir este método:

    override func willRotate(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) {
    
    
        super.willRotate(to: toInterfaceOrientation, duration: duration)
        if toInterfaceOrientation.isPortrait {
    
    

        }
        if toInterfaceOrientation.isLandscape {
    
    

        }
        
    }

Pero al ejecutar encontré que la vista secundaria de VC también se rotará, y la adaptación de la interfaz es demasiado fuerte, así que me di por vencido; este método en realidad se abandonó en ios9 y posteriores, vea las indicaciones de xcode para usar este método de devolución de llamada; pensé viewWillTransitionToSize:withTransitionCoordinator:en Por el momento, este es solo willRotateun método alternativo Eso es todo, después de la implementación, se puede obtener la orientación de la pantalla, pero la vista secundaria definitivamente se rotará.Después de reescribir este método, se verifica mi suposición.

Después de buscar en Internet, vi que alguien implementó este método en AppDelegate func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMasky usó un atributo global para controlarlo en el ciclo de vida de vc donde la rotación está deshabilitada. Desafortunadamente, la orientación de la pantalla está deshabilitada, pero el willRotatemétodo no devuelve la llamada.

También se menciona en Internet que se acepta la Notificación de rotación de pantalla. Supongo que esta notificación no se recibirá después de que se deshabilite la rotación de pantalla. Efectivamente, escribí un método de notificación y no lo recibí después de la verificación.

resolver:

Las ideas anteriores se basan en la función "deshabilitar la rotación de pantalla" y luego obtener la devolución de llamada, como se esperaba, todas ellas no funcionarán. De repente recordé que muchos juegos que eran muy populares cuando los teléfonos inteligentes se hicieron populares por primera vez hace más de diez años, muchos de ellos juzgaban la dirección en función del sensor de movimiento del dispositivo, por lo que se puede obtener la dirección de la pantalla en función del marco CoreMotioin que viene. con iOS? Supongo que debería ser posible, porque cuando jugaba juegos en ese momento, la orientación de la pantalla estaba deshabilitada antes de jugar, pero el juego aún puede obtener la orientación de la pantalla para las operaciones somatosensoriales. A ver que decimos, mitad copia y mitad escritura de una clase de herramienta simple, y funciona después de un intento, el código es el siguiente:

import UIKit
import CoreMotion

class MotionService: NSObject {
    
    

    public static var singleston: MotionService = MotionService()
    
    private var orientationChangeBlock: ((_ rawValue: Int) -> Void)?
    
    private var currentRawValue: Int = 0
    
    private lazy var motionManager: CMMotionManager = {
    
     CMMotionManager() }()
    
    private override init() {
    
    
        super.init()
        
        initData()
    }
    
    private func initData(){
    
    
        motionManager.accelerometerUpdateInterval = 1 / 10
        
        if motionManager.isDeviceMotionAvailable {
    
    
            let queue = OperationQueue()
            
            motionManager.startDeviceMotionUpdates(to: queue) {
    
     motion, error in
                let x = motion?.gravity.x ?? 0
                let y = motion?.gravity.y ?? 0
                
                if fabs(y) >= fabs(x) {
    
    
                    if y >= 0 {
    
    
                    	// UIDeviceOrientationPortraitUpsideDown
                        self.orientationChangeBlock?(0)
                        self.currentRawValue = 0
                    } else {
    
    
                        // UIDeviceOrientationPortrait
                        self.orientationChangeBlock?(1)
                        self.currentRawValue = 1
                    }
                } else {
    
    
                    if x >= 0 {
    
    
                        // UIDeviceOrientationLandscapeRight
                        self.orientationChangeBlock?(2)
                        self.currentRawValue = 2
                    } else {
    
    
                    	// UIDeviceOrientationLandscapeLeft
                        self.orientationChangeBlock?(3)
                        self.currentRawValue = 3
                    }
                }
            }
        }
        
    }
    
    /** 使用尾随闭包简化调用,rawValue参考上面block的参数 */
    public func setOnDeviceOrientationChangeListener(_ listener: ((_ rawValue: Int) -> Void)?){
    
    
        orientationChangeBlock = {
    
     rawValue in
            if self.currentRawValue != rawValue {
    
    
                listener?(rawValue)
            }
        }
    }
    
}

No escribiré las notas, después de todo, los novatos no pueden encontrar este nivel de problemas y los veteranos pueden entenderlos de un vistazo.
La fuente de la copia: Swift usa CoreMotion para obtener la dirección actual de la pantalla

Instrucciones:

let motionService: MotionService = MotionService.singleston
motionService.setOnDeviceOrientationChangeListener {
    
     rawValue in
	Log.warning(rawValue)
}

Supongo que te gusta

Origin blog.csdn.net/kicinio/article/details/128606803
Recomendado
Clasificación