UIModalPresentationPopover для iPhone 6 Plus в альбомной ориентации не отображает всплывающее окно

Я хочу всегда отображать ViewController во всплывающем окне на всех устройствах и во всех ориентациях. Я попытался добиться этого, приняв UIPopoverPresentationControllerDelegate и установив sourceView и sourceRect.

Это очень хорошо работает для всех устройств и ориентаций, кроме 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 }

Все устройства под iOS 8.2 или выше


person Loegic    schedule 21.05.2015    source источник


Ответы (4)


Реализуйте новый метод 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
Хороший звонок! Я забыл, что метод делегата изменился для 8.3. - person ; 27.05.2015
comment
@PetahChristian Спасибо! Да, это было довольно тихое изменение, и, похоже, оно не задокументировано, кроме как в различиях API. - person Joshua; 27.05.2015
comment
@Джошуа ДА! Я реализовал - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; } но новый API решает мою проблему, спасибо, сэр! - person Loegic; 27.05.2015
comment
По какой-то причине мне потребовалось три чтения, чтобы наконец увидеть часть :traitCollection этого метода делегата. Сначала я подумал, да, я реализовал это, так как более короткая версия работает для других устройств. Спасибо! ... Я бился головой о стену, почему это не сработает на 6+. Это всегда самые простые вещи. - person digitalHound; 04.12.2015
comment
Почему Apple сделала это конкретное изменение для 6/7 Plus в альбомной ориентации? Почему бы просто не отобразить всплывающее окно, если это то, что вы просили? - person bartzy; 19.01.2017
comment
Спасибо тебе за это! Должен ли я сохранить более короткую версию этого (без traitColleciton), также реализованную, если моя минимальная iOS равна 9, или я хорошо использую только этот метод? - person Lucas P.; 26.03.2018

В Swift 3, если вы реализовали исходный метод adaptivePresentationStyle, работает простое добавление этого кода:

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
    return adaptivePresentationStyle(for: controller)
}
person JKaz    schedule 24.11.2016

Apple разработала презентацию iPhone 6 Plus таким образом, исходя из его размера.

Чтобы предотвратить модальное представление на iPhone 6 Plus, вам придется переопределить коллекцию признаков (горизонтальный размер).

Вы должны иметь возможность установить свойство overrideTraitCollection для контроллера представления:

presentedVC.presentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact];

(Извините за Objective C! Я еще не изучил Swift.)

person Community    schedule 22.05.2015
comment
Извините, но у меня это не сработало, я не могу переопределить traitCollection, означает, что всплывающее окно по-прежнему представлено в виде листа страницы на iPhone 6 plus только в альбомной ориентации. - person Loegic; 26.05.2015
comment
Хотя я и заинтригован, сегодня утром у меня нет времени расследовать это. Я могу предложить вознаграждение за вопрос, чтобы привлечь к нему внимание. :) - person ; 26.05.2015
comment
Я видел это, спасибо :) Переопределение traitCollection казалось отличной идеей, но, похоже, его проигнорировали. - person Loegic; 26.05.2015
comment
ну, он переопределяет коллекцию признаков, когда вы добавляете эту строку, прежде чем установить modalPresentationStyle = UIModalPresentationPopover, но я думаю, что UIPopoverPresentationController не знает об этом изменении и все еще показывает без панели навигации, чтобы сохранить/закрыть всплывающее окно - person Jorge Balleza; 03.07.2015

Примечание для тех, у кого есть проблемы с этим:

Этот

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *) controller traitCollection:(UITraitCollection *)traitCollection {
    return UIModalPresentationNone;
}

Это не то же самое, что это

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
    return UIModalPresentationNone;
}

Последний не будет вызываться / работать так же, как первый.

person visc    schedule 05.11.2019