2014-12-08 7 views
28

Я пытаюсь использовать 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) 
    } 
} 

Update 9/27/16 с правильным ответом

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { 
    return .none 
} 
+0

ли вы проверить его на iPhone? – gabbler

+0

@gabbler Nope. Только на тренажере. У меня нет iPhone для тестирования. –

+0

На iPhone симулятор? – gabbler

ответ

29

В iPhone, вы должны добавить следующее для того, чтобы представить поповер.

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle { 
    // Return no adaptive presentation style, use default presentation behaviour 
    return .None 
} 
+0

Спасибо. Это исправило это! Это тоже должно быть одинаково для размеров iPad? –

+2

Да, совместим с iPad. – gabbler

+1

Где вы это добавляете? К контроллеру зрения Поповера? – Noah

13

Для Swift3/IOS10, похоже, что мы должны сделать некоторые вещи, как

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle 
{ 
    return .none 
} 

Добавление этого ответа, в случае, если кто-то бежит в эту проблему, как я сделал при переходе на swift3/IOS10

+0

ли это работать в КСН 9? – Eddie

+0

@ Эйди, я не пробовал. У меня в основном были проблемы во время быстрой миграции. –

1

Принятый ответ правильный. Для полноты картины, см Adapting Presented View Controllers to a New Style в документации Apple:

Используйте adaptivePresentationStyleForPresentationController: метод делегата, чтобы указать другой стиль презентации, чем по умолчанию. При переходе к компактной среде единственными поддерживаемыми стилями являются два полноэкранных стиля или UIModalPresentationNone. Возврат UIModalPresentationNone сообщает контроллеру презентации игнорировать компактную среду и продолжает использовать предыдущий стиль презентации. В случае с popover игнорирование изменения дает вам такое же поведение, как и у iPad, на всех устройствах.

Убедитесь, что требуемые конфигурации из Presenting a View Controller in a Popover выполнены:

После установки модального стиля представления [предъявленный контроллера представления] для UIModalPresentationPopover настройте следующие поповер связанных атрибутов:

  • Задайте preferredContentSize свойство вашего контроллера в желаемом размере.
  • Установите опорную точку популяции с помощью связанного с ней объекта UIPopoverPresentationController, который доступен из вида контроллера popoverPresentationController.
  • Установите только один из следующих действий:
    • Установите barButtonItem свойство элемента кнопки бара.
    • Задайте sourceView и sourceRect Недвижимость для определенного региона в одном из мнений.