iOS 11 UIImagePickerController странная проблема - PullRequest
0 голосов
/ 06 мая 2018

Я использую UIImagePickerController, чтобы выбрать одно изображение из библиотеки фотографий. Когда iPad работает в альбомном режиме, возникает странная проблема.

Средство выбора изображений представлено с помощью UIPopoverPresentationController на iPad в соответствии с рекомендациями. Когда он впервые представлен, строка состояния верна:

enter image description here

Однако при переходе на второй уровень библиотеки фотографий строка состояния меняется на портретный режим:

enter image description here

Что я заметил до сих пор:

  1. Эта проблема появляется только в iOS 11, а не в iOS 10.
  2. Когда это произойдет, поверните iPad в портретное положение и обратно в альбомную ориентацию строки состояния.
  3. Это произошло только в первый раз, представляя контроллер сборщика.
  4. Если игнорировать, представление другого модального вида будет в портретном режиме:

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 голосов
/ 23 июля 2018

Я наконец нашел причину своей проблемы.

Мое приложение должно поддерживать всю ориентацию на iPad и портретный режим только на iPhone. Поэтому я добавил следующий код UIApplicationDelegate:

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

    return UIInterfaceOrientationMaskPortrait;
 }

Но иногда это дает мне нулевое окно, как в случае UIImagePickerController, представленного с использованием UIPopoverPresentationController на iPad, и возвращает UIInterfaceOrientationMaskPortrait и вызывает то, что строка состояния поворачивается в портретный режим. Я также заметил, что это происходит только при проверке UIRequiresFullScreen.

Я решил свою проблему, проверив, что окно не равно нулю, как показано ниже:

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