UIImagePickerController从仅在横向iPhone / iPad应用程序中的Album中选择

时间:2016-11-15 18:28:48

标签: ios swift uiimagepickercontroller uipopovercontroller landscape

我在谷歌搜索时发现了很多文章,但似乎没有真正涵盖这种情况,所以我会尝试非常具体。 我有一个仅适用于iPhone和iPad的Landscape应用程序。我试图让用户使用以下代码从他的相册中选择一张图片:

let imagePicker = UIImagePickerController()
imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
imagePicker.mediaTypes = [kUTTypeImage as String]
imagePicker.modalPresentationStyle = UIModalPresentationStyle.Popover
imagePicker.allowsEditing = false
context.presentViewController(imagePicker, animated: true, completion: {
    () -> Void in

})

我正在使用Popover演示风格,因为Apple mentions在iPad上这是必须设置的方式,否则将抛出异常:

  

该表格表明在iPad上,如果指定了源类型   photoLibrary或savedPhotosAlbum,您必须出示图像选择器   使用弹出控制器(要了解如何执行此操作,请参阅   UIPopoverPresentationController)。如果您尝试呈现图像   模拟选择器(全屏),用于选择已保存的图片和   电影,系统引发了例外。

此操作失败并出现以下错误

*** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES'

我尝试过:

  • 子类UIImagePickerController和UIViewController支持横向方向并将shouldAutorotate设置为false,但我认为这没用,因为这里的类失败是PUUIAlbumListViewController
  • 设置我的应用程序以支持Portrait,这可行,但随后整个应用程序使用手机自动进行,这不是意味着发生
  • 使用中间UIPopoverPresentationController,但从未让它显示任何内容

更新 不是答案,但看起来很疯狂,我不认为这是可行的。感谢Apple提供最先进的API,其中一切都很有意义。 我最终使用DKImagePickerController,完成了工作

2 个答案:

答案 0 :(得分:0)

我还有一个强制执行景观的应用程序。唯一的选择是放松并允许图像选择器作为肖像出现,因为这是它出现时的默认位置。

答案 1 :(得分:0)

对导航控制器进行子类化并更改横向方向遮罩。然后从NavigationController中显示您的Image Picker控制器。

class CustomNavigation: UINavigationController {
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
override var shouldAutorotate: Bool {
    return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.portrait
}

/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/


}