从视图观察界面方向

问题描述 投票:2回答:1

我正在使用NotificationCenter观察interfaceOrientationUIApplication.willChangeStatusBarOrientationNotification的变化。但是UIApplication.willChangeStatusBarOrientationNotification现在被标记为已弃用。建议使用viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator,但这是从ViewController调用的方法。我有一个UIView的子类,内部需要这个子类,而Im将这个View公开为framework。我希望仍然能够保持此功能,而无需从ViewController中显式调用。是否有另一个选择可以直接在View内部实现此目标?我尝试用KVO观察UIWindowScene.interfaceOrientation,但这没有用。

public extension Notification.Name {
    static let willChangeStatusBarOrientationNotification = UIApplication.willChangeStatusBarOrientationNotification    
}

...

@objc private func statusBarOrientationWillChange(notification: Notification) {
    if let orientationRawValue = notification.userInfo?[UIApplication.statusBarOrientationUserInfoKey] as? Int, let orientation = AVCaptureVideoOrientation(rawValue: orientationRawValue) {
        configureVideoOrientation(interfaceOrientation: orientation)
        updateSceneInformation()
    }
}

...

private func initialize() {
    NotificationCenter.default.addObserver(self, selector: #selector(statusBarOrientationWillChange(notification:)), name: .willChangeStatusBarOrientationNotification, object: nil)

}

enter image description here

swift key-value-observing interface-orientation
1个回答
0
投票

实际上,我不使用通知来观察方向变化,因为它对我不起作用。我将viewDidLayoutSubviews用于如下操作。

class HomeViewController: UIViewController {
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        /* orientation change */
        detectOrientation()
    }

    func detectOrientation() {
        if UIDevice.current.orientation.isLandscape {

        } else {

        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.