Я пытаюсь отобразить один UIViewController
как всплывающее окно из другого. Для этого я установил следующее...
func showPopover(ofViewController popoverViewController: UIViewController, sender: UIView) {
popoverViewController.modalPresentationStyle = .popover
popoverViewController.popoverPresentationController?.sourceView = sender
popoverViewController.popoverPresentationController?.sourceRect = sender.bounds
popoverViewController.popoverPresentationController?.delegate = self
self.present(popoverViewController, animated: true, completion: nil)
}
Однако новый VC всегда отображается как полноэкранная модальная презентация на компактных устройствах, а не как всплывающее окно. Основываясь на том, что я прочитал здесь и здесь, это нормальное поведение, но его можно настроить путем делегирования.
Я объявил представляющий VC реализующим UIPopoverPresentationControllerDelegate
, установил его в качестве делегата и реализовал необходимые методы; однако методы делегирования никогда не вызываются. Это означает, что «всплывающее окно» по-прежнему отображается модально, несмотря ни на что.
Любой совет приветствуется.
Некоторые другие выноски:
viewControllerForAdaptivePresentationStyle
действительно вызывается, если перед ним добавляется маркер@objc
, но это не работает для других.- Xcode выдает предупреждение для каждого из них: Метод экземпляра... почти соответствует необязательному требованию... протокола 'UIAdaptivePresentationControllerDelegate'; однако сигнатура метода соответствует 100%. Не уверен, что это экземпляр этой ошибки , который, как говорят некоторые, все еще существует в Xcode 10.1.
Спасибо.
Реализованы функции делегата:
func adaptivePresentationStyle(for: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.popover
}
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return UIModalPresentationStyle.popover
}
func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
switch style {
case .fullScreen: // Configuration for full-screen
default: return controller.presentedViewController
}
}
override var preferredContentSize: CGSize { get { let size = CGSize(width: 80, height: 60) return size } set { super.preferredContentSize = newValue } }
- person TheNeil   schedule 18.03.2019.none
изadaptivePresentationStyle(for: traitCollection:)
. Однако это странно, поскольку я вставил ваш код в Xcode и не получил этих предупреждений. - person Paulw11   schedule 18.03.2019viewControllerForAdaptivePresentationStyle
вызывается, несмотря на наличие такого предупреждения. - person TheNeil   schedule 18.03.2019viewControllerForAdaptivePresentationStyle
не вызывается без@objc
- person TheNeil   schedule 18.03.2019extension UIViewController: UIPopoverPresentationControllerDelegate
- person TheNeil   schedule 18.03.2019UIViewController
; это может иметь непредвиденные последствия - person Paulw11   schedule 18.03.2019