无法通过纵向模式获取横向图像选择器

时间:2017-03-20 18:17:18

标签: ios swift

我的应用程序处于完全横向模式但是从相册中挑选图像时,我不得不添加纵向模式。我只想在选择图像时使用纵向模式。现在它表现得很奇怪,当手机处于横向模式时没有方向锁定和选择图像时,图像选择器显示为一半。右半部分是黑色,左边是景观中的图像选择器(所以是的,这看起来很奇怪)。这是我的设置:

enter image description here

func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
    return .all
}

在viewDidLoad中的ViewController中(我需要在每个ViewController中添加它...):

let value = UIInterfaceOrientation.landscapeLeft.rawValue
        UIDevice.current.setValue(value, forKey: "orientation")

private func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.landscapeLeft
}
open override var shouldAutorotate: Bool {
    get {
        return false
    }
}

我已经查看了质疑这个问题的人的答案。我无法让它工作:(

1 个答案:

答案 0 :(得分:1)

我有一段时间遇到过类似的问题。如果我理解你的问题是正确的,那么除非出现照片选择器,否则您希望应用程序保持横向模式。这是你要做的:

  1. 进入您的设置并选中这三个方向选项:人像,左侧风景,右侧风景。
  2. 进入AppDelegate并添加此静态变量:

    static var canRotate = false {
        didSet{
          UIDevice.current.setValue(canRotate ? UIInterfaceOrientation.portrait.rawValue : UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
        }
    }
    
  3. 同样在您的AppDelegate中,添加此功能:

    func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
        if AppDelegate.canRotate {
            return .portrait
        } else {
            //return the orientation you want your app to be in
            return [.landscapeLeft, .landscapeRight]
        }
    }
    
  4. 此时,您可以通过调用AppDelegate.canRotate = true或false来控制是否可以旋转设备

    剩下的就是在你的图片选择器代码中添加这个变量,这是你做的:

    if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
                let imagePicker = UIImagePickerController()
                imagePicker.delegate = self
                imagePicker.sourceType = .camera
                imagePicker.allowsEditing = true            
    
                AppDelegate.canRotate = true
                self.present(imagePicker, animated: true, completion: nil)
            }
    

    此外,在此功能中:

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        AppDelegate.canRotate = false
        picker.dismiss(animated: true, completion: nil)
    }
    

    在这一个中也是如此:

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        AppDelegate.canRotate = false
        picker.dismiss(animated: true, completion: nil)
    }
    

    此代码可能有优化,但这是您需要的核心功能。

    让我知道这是怎么回事,如果它有效,有毛刺,或者没有。