iOS 11 UIImagePickerController奇怪的问题

时间:2018-05-06 03:55:25

标签: ios objective-c uiimagepickercontroller

我正在使用UIImagePickerController从照片库中选择单个图像。在横向模式下,iPad上存在一个奇怪的问题。

根据建议,使用iPad上的UIPopoverPresentationController呈现图像选择器。首次显示时,状态栏是正确的:

enter image description here

但是,当进入照片库的第二级时,状态栏将更改为纵向模式:

enter image description here

到目前为止我注意到的是:

  1. 此问题仅出现在iOS 11中,而不是iOS 10中。
  2. 当它发生时,将iPad旋转为纵向,然后返回横向将固定状态栏方向。
  3. 这只是第一次出现选择器控制器。
  4. 如果忽略,则呈现其他模态视图将处于纵向模式:
  5. enter image description here

    呈现uiimagepickerController的代码如下:

        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.modalPresentationStyle = UIModalPresentationPopover;
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        picker.delegate = self;
    
        [self presentViewController:picker animated:YES completion:nil];
    
        UIPopoverPresentationController *popupController = picker.popoverPresentationController;
        if (popupController) {
            popupController.barButtonItem = sender;
        }
    

    知道我做错了什么,或者这是一个错误?

    整个示例项目可以在这里下载: https://www.dropbox.com/s/zgipclyr0mz26c6/test.zip?dl=0

1 个答案:

答案 0 :(得分:0)

我终于找到了问题的原因。

我的应用程序需要支持iPad上的所有方向和仅iPhone上的纵向模式。因此,我添加了以下UIApplicationDelegate代码:

- (UIInterfaceOrientationMask) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (window.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
        return UIInterfaceOrientationMaskAll;
    }

    return UIInterfaceOrientationMaskPortrait;
 }

但是有时它会给我零个窗口,例如在iPad上使用UIPopoverPresentationController呈现的UIImagePickerController的情况下,它将返回UIInterfaceOrientationMaskPortrait并使状态栏旋转到纵向模式。我还注意到只有在选中UIRequiresFullScreen时才会发生这种情况。

我通过检查窗口是否为nil来解决问题,如下所示:

- (UIInterfaceOrientationMask) application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    if (window) {
        if (window.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad) {
            return UIInterfaceOrientationMaskAll;
        } else {
            return UIInterfaceOrientationMaskPortrait;
        }
    } else {
        return UIInterfaceOrientationMaskAll;
    }
 }