Подтвердить что ты не робот

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
}
4b9b3361

Ответ 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 для определенной области в одном из ваших представлений.