UIPopoverPresentationController, отображающий popover как полный экран
Я пытаюсь использовать UIPopoverPresentationController
для отображения popover
, который не занимает весь экран. Я не поверил многим различным учебникам.
Вот мой код. Он правильно создает экземпляр ViewController
, но он занимает весь экран вместо небольшого экрана, как я определил в preferredContentSize
.
func showPopover() {
let vc = self.storyboard?.instantiateViewControllerWithIdentifier("PopupTimePickerViewController") as PopupTimePickerViewController
vc.modalPresentationStyle = .Popover
vc.preferredContentSize = CGSizeMake(200, 100)
if let presentationController = vc.popoverPresentationController {
presentationController.delegate = self
presentationController.permittedArrowDirections = .Up
presentationController.sourceView = self.view
presentationController.sourceRect = CGRectMake(0, 0, 50, 50)
self.presentViewController(vc, animated: true, completion: nil)
}
}
Обновление 9/27/16 с правильным ответом
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
Ответы
Ответ 1
В iPhone вы должны добавить следующее, чтобы представить popover.
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle {
// Return no adaptive presentation style, use default presentation behaviour
return .None
}
Ответ 2
Для Swift3/IOS10, похоже, нам нужно сделать что-то вроде
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
{
return .none
}
Добавляя этот ответ, в случае, если кто-то сталкивается с этой проблемой, как это было при миграции на swift3/IOS10
Ответ 3
Принятый ответ правильный. Для полноты см. Адаптация представленных контроллеров представления к новому стилю в документах Apple:
Используйте метод делегатов adaptivePresentationStyleForPresentationController:
, чтобы указать другой стиль презентации, чем значение по умолчанию. При переходе к компактной среде единственными поддерживаемыми стилями являются два полноэкранных стиля или UIModalPresentationNone
. Возврат UIModalPresentationNone
указывает контроллеру презентации игнорировать компактную среду и продолжать использовать предыдущий стиль презентации. В случае с popover игнорирование изменения дает вам одинаковое поведение по всему IPad на iPad.
Убедитесь, что требуемые конфигурации Представление контроллера просмотра в Popover выполнены:
После настройки стиля модальной презентации [представленного контроллера представления] на UIModalPresentationPopover
настройте следующие атрибуты, связанные с popover:
- Задайте свойство
preferredContentSize
вашего контроллера просмотра желаемого размера. - Установите опорную точку popover с помощью связанного объекта
UIPopoverPresentationController
, доступного из view controllers popoverPresentationController
. - Установите только одно из следующего:
- Установите для свойства
barButtonItem
элемент панели. - Задайте свойства
sourceView
и sourceRect
для определенной области в одном из ваших представлений.