2015-05-21 5 views
24

Я хочу всегда представлять ViewController во всех устройствах и всех ориентациях. Я попытался это сделать, приняв UIPopoverPresentationControllerDelegate и установив sourceView и sourceRect.UIModalPresentoverPopover для iPhone 6 Plus в ландшафте не отображается popover

Это хорошо работает для всех устройств и ориентации, за исключением iPhone 6 Plus в ландшафте. В этом случае контроллер просмотра соскальзывает со дна экрана в виде листа. Как я могу предотвратить это, чтобы он всегда появлялся в popover?

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 } 

Все устройства находятся под прошивкой 8.2 или выше

ответ

57

Внедрение нового метода 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 сообщает контроллер представления, чтобы использовать оригинальный Прес который в вашем случае отобразит popover.

+1

Хороший звонок! Я забыл, что метод делегата изменился на 8.3. –

+1

@PetahChristian Спасибо! Да, это было довольно тихое изменение и, похоже, не было документировано иначе, чем в API diff. – Joshua

+0

@ Joshua YES! Я реализовал - (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController *) контроллер { return UIModalPresentationNone; } но новый API решает мою проблему, спасибо, сэр! – Loegic

1

компании Apple разработала презентацию iPhone 6 Plus, чтобы вести себя таким образом, основываясь на своем размерном классе.

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

Вы должны быть в состоянии установить overrideTraitCollection свойство для контроллера представления: (!. Извините за Objective C Я не узнал Swift еще)

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

+0

Мне очень жаль, но это не работает для меня, я не могу переопределить traitCollection , «означать быть» popover все еще представлен как лист страницы на iPhone 6 плюс озелененный только – Loegic

+0

Хотя заинтригованный, у меня нет времени этим утром, чтобы исследовать это. Я могу предложить щедрость на вопрос, чтобы привлечь к нему некоторое внимание. :) –

+0

Я видел это, спасибо :) Отказ от traitCollection был отличной идеей, но, похоже, это игнорируется. – Loegic

2

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

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { 
    return adaptivePresentationStyle(for: controller) 
} 
Смежные вопросы