Настройка UIModalPresentationStyle для iPhone 6 Plus в альбомной ориентации?

Я хочу всегда отображать контроллер представления во всплывающем окне на всех устройствах и во всех ориентациях. Я попытался добиться этого, приняв UIPopoverPresentationControllerDelegate и установив sourceView и sourceRect. Переход в раскадровке настроен как переход Present As Popover. Это очень хорошо работает для всех устройств и ориентаций, кроме iPhone 6 Plus в альбомной ориентации. В этом случае контроллер представления скользит вверх от нижней части экрана на листе формы. Как я могу предотвратить это, чтобы он всегда отображался во всплывающем окне?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let popoverPresentationController = segue.destinationViewController.popoverPresentationController
    popoverPresentationController?.delegate = self
    popoverPresentationController?.sourceView = self.titleLabel!.superview
    popoverPresentationController?.sourceRect = self.titleLabel!.frame
}

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return UIModalPresentationStyle.None
}

person Jordan H    schedule 26.04.2015    source источник


Ответы (1)


Реализуйте новый (начиная с iOS 8.3) adaptivePresentationStyleForPresentationController:traitCollection: метод UIAdaptivePresentationControllerDelegate:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection {
    // This method is called in iOS 8.3 or later regardless of trait collection, in which case use the original presentation style (UIModalPresentationNone signals no adaptation)
    return UIModalPresentationNone;
}

UIModalPresentationNone указывает контроллеру презентации использовать исходный стиль презентации, который в вашем случае будет отображать всплывающее окно.

person Joshua    schedule 27.05.2015
comment
Это больше не работает в Xcode 7. Теперь в документах указано, что вы можете возвращать только FullScreen и OverFullScreen из этого метода. - person Jordan H; 03.09.2015
comment
Конечно, developer.apple.com/library/prerelease/ios/documentation/UIKit/: - person Jordan H; 03.09.2015
comment
На самом деле, я рассматривал метод, похожий на тот, который вы упомянули. Метод, включающий traitCollection, не указан в документах. Но, увы, это не работает для меня, потому что он не вызывает этот метод при наличии на iPhone 6 Plus в альбомной ориентации, однако при вращении он вызывает этот метод. В портретном режиме он вызывает его при наличии, но возврат .None приводит к тому, что презентация отображается в полноэкранном режиме, а не во всплывающем окне. - person Jordan H; 03.09.2015
comment
Неважно, это все еще работает, как и ожидалось. Проблема заключалась в том, что я представлял ее перед настройкой делегата (что и должно быть сделано в документах). Установка делегата его popoverPresentationController перед его представлением решила проблему. - person Jordan H; 03.09.2015
comment
@Joey У меня такая же проблема на iPhone 6 Plus, альбомный режим, iOS 9 (на iOS 8 работает нормально), и я сначала устанавливаю делегата, а затем показываю. Что может быть причиной? - person iOS Dev; 21.07.2016