IOS10 中无法锁定一个视图控制器的旋转
Unable to lock rotation for one view controller in IOS10
背景
我有一个应用程序使用 AVFoundation 来拥有自定义相机。这发生在 OCRViewController
。当我拍照时,我将拍摄的照片发送到不同的视图 ImagePreviewViewController
。
我正在使用 Xcode 10.2.1 (10E1001)
和 Swift 5
目标
我想要实现的是将 ImagePreviewViewController
的方向锁定为图像的原始方向。我已经知道如何获取图像的方向,但我无法锁定视图的方向。
我这样得到图像旋转:let imageOri = capturedImage?.imageOrientation
我尝试了什么?
我尝试了接受的答案以及其他几个来源:
阅读 https://developer.apple.com/documentation/uikit/uiviewcontroller#//apple_ref/occ/instm/UIViewController/supportedInterfaceOrientations 的 Handling View Rotation 下的文档说明如下:
我在编写此查询时也尝试了许多建议的解决方案,但是,大多数似乎使用以下方法(或它的变体),它对我不起作用。
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
override func shouldAutorotate() -> Bool{
return false
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return UIInterfaceOrientation.Portrait
}
As of iOS 8, all rotation-related methods are deprecated. Instead, rotations are treated as a change in the size of the view controller’s view and are therefore reported using the viewWillTransition(to:with:) method.
但是,我不确定如何从这里取得进展。
有趣的代码片段
下面的方法在我的OCRViewController
中,这里我实例化了ImagePreviewViewController
并附上抓拍的图片。
func displayCapturedPhoto(capturedPhoto : UIImage) {
let imagePreviewViewController = storyboard?.instantiateViewController(withIdentifier: "ImagePreviewViewController") as! ImagePreviewViewController
imagePreviewViewController.capturedImage = capturedPhoto
navigationController?.pushViewController(imagePreviewViewController, animated: true)
}
在我的 ImagePreviewViewController
中使用下面的覆盖函数,我能够检测到视图控制器的方向。
override func viewDidAppear(_ animated: Bool) {
if UIDevice.current.orientation.isLandscape {
print("Landscape")
} else {
print("Portrait")
}
}
要限制一个屏幕的旋转,使用这个。
在 AppDelegate 中
var restrictRotation = Bool()
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if !restrictRotation {
return .portrait
} else {
return .all
}
}
在你的viewcontroller中添加函数,
func restrictRotation(restrict : Bool) -> Void {
let appDelegate = UIApplication.shared.delegate as? AppDelegate
appDelegate?.restrictRotation = restrict
}
在ViewDidload()方法中,调用禁用旋转的函数。
self.restrictRotation(restrict: false)
在 viewWillDisappear() 方法中,调用启用旋转的函数。
self.restrictRotation(restrict: true)
背景
我有一个应用程序使用 AVFoundation 来拥有自定义相机。这发生在 OCRViewController
。当我拍照时,我将拍摄的照片发送到不同的视图 ImagePreviewViewController
。
我正在使用 Xcode 10.2.1 (10E1001)
和 Swift 5
目标
我想要实现的是将 ImagePreviewViewController
的方向锁定为图像的原始方向。我已经知道如何获取图像的方向,但我无法锁定视图的方向。
我这样得到图像旋转:let imageOri = capturedImage?.imageOrientation
我尝试了什么?
我尝试了接受的答案以及其他几个来源:
阅读 https://developer.apple.com/documentation/uikit/uiviewcontroller#//apple_ref/occ/instm/UIViewController/supportedInterfaceOrientations 的 Handling View Rotation 下的文档说明如下:
我在编写此查询时也尝试了许多建议的解决方案,但是,大多数似乎使用以下方法(或它的变体),它对我不起作用。
override func supportedInterfaceOrientations() -> Int {
return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}
override func shouldAutorotate() -> Bool{
return false
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return UIInterfaceOrientation.Portrait
}
As of iOS 8, all rotation-related methods are deprecated. Instead, rotations are treated as a change in the size of the view controller’s view and are therefore reported using the viewWillTransition(to:with:) method.
但是,我不确定如何从这里取得进展。
有趣的代码片段
下面的方法在我的OCRViewController
中,这里我实例化了ImagePreviewViewController
并附上抓拍的图片。
func displayCapturedPhoto(capturedPhoto : UIImage) {
let imagePreviewViewController = storyboard?.instantiateViewController(withIdentifier: "ImagePreviewViewController") as! ImagePreviewViewController
imagePreviewViewController.capturedImage = capturedPhoto
navigationController?.pushViewController(imagePreviewViewController, animated: true)
}
在我的 ImagePreviewViewController
中使用下面的覆盖函数,我能够检测到视图控制器的方向。
override func viewDidAppear(_ animated: Bool) {
if UIDevice.current.orientation.isLandscape {
print("Landscape")
} else {
print("Portrait")
}
}
要限制一个屏幕的旋转,使用这个。
在 AppDelegate 中
var restrictRotation = Bool()
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
if !restrictRotation {
return .portrait
} else {
return .all
}
}
在你的viewcontroller中添加函数,
func restrictRotation(restrict : Bool) -> Void {
let appDelegate = UIApplication.shared.delegate as? AppDelegate
appDelegate?.restrictRotation = restrict
}
在ViewDidload()方法中,调用禁用旋转的函数。
self.restrictRotation(restrict: false)
在 viewWillDisappear() 方法中,调用启用旋转的函数。
self.restrictRotation(restrict: true)