废话少说,先上代码(Swift 3):
在viewDidLoad()
中注册通知:
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(deviceDidRotate), name: .UIDeviceOrientationDidChange, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(toLandscapeRight), name: .UIWindowDidBecomeVisible, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(toPortrait), name: .UIWindowDidBecomeHidden, object: nil)
}
在deinit()
中移除通知:
deinit {
NotificationCenter.default.removeObserver(self, name: .UIDeviceOrientationDidChange, object: nil)
NotificationCenter.default.removeObserver(self, name: .UIWindowDidBecomeVisible, object: nil)
NotificationCenter.default.removeObserver(self, name: .UIWindowDidBecomeHidden, object: nil)
}
通知的响应方法:
@objc fileprivate func deviceDidRotate() {
UIApplication.shared.isStatusBarHidden = false
}
@objc fileprivate func toLandscapeRight() {
let value = UIInterfaceOrientation.landscapeRight.rawValue
// Trick: ViewController 生命周期,第一次设置转横屏,强制设置两次(不然第一次设置不成功)
if allowTime > 0 {
allowTime -= 1
UIDevice.current.setValue(value, forKey: "orientation")
let value2 = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value2, forKey: "orientation")
}
UIDevice.current.setValue(value, forKey: "orientation")
}
@objc fileprivate func toPortrait() {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
总结:
实际使用中,发现在添加UIWebView的ViewController中,第一次设置横屏会有没反应的情况出现。使用了很trick的方法:添加了一个
Int
类型的值allowTime
,设置初始值为3,允许初次设置横屏时,多设置几下,这样从用户体验上就没有任何问题了。
网友评论