iOS 11 UIImagePickerController 奇怪的问题

iOS 11 UIImagePickerController strange issue

我正在使用 UIImagePickerController select 来自照片库的单个图像。 iPad 在横向模式下出现一个奇怪的问题。

图像选择器是按照建议在 iPad 上使用 UIPopoverPresentationController 呈现的。首次呈现时,状态栏正确:

但是,当进入照片库的第二层时,状态栏变为纵向模式:

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

  1. 此问题仅出现在 iOS 11,而不是 iOS 10。
  2. 发生这种情况时,将 iPad 旋转为纵向并返回横向将修复状态栏方向。
  3. 这只是在第一次展示选择器控制器时发生的。
  4. 如果忽略,呈现其他模态视图将以纵向模式显示:

呈现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

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

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

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

    return UIInterfaceOrientationMaskPortrait;
 }

但有时它会给我 nil window,例如在 iPad 上使用 UIPopoverPresentationController 呈现的 UIImagePickerController 的情况,并且 return UIInterfaceOrientationMaskPortrait 并导致状态栏旋转到纵向模式.我还注意到只有在选中 UIRequiresFullScreen 时才会发生这种情况。

我已经通过检查 window 不是 nil 解决了我的问题,如下所示:

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