Вы можете применить ограничения к кнопке sourceView, а затем просто использовать ее в качестве источника всплывающего окна:
myPopoverViewController.popoverPresentationController?.sourceView = button
Вы также можете установить sourceView в раскадровке, но sourceRect необходимо установить в коде:
myPopoverViewController.popoverPresentationController?.sourceRect = button.bounds
Вам нужен правильный исходный прямоугольник, чтобы стрелка всплывающего окна правильно выровнялась. Теперь вам не нужно закрывать и показывать всплывающее окно при ротации. UIPopoverPresentationController сделает это за вас. Вам даже не нужно обновлять sourceView/sourceRect после того, как они настроены на создание всплывающего окна.
Используйте viewWillTransition
, чтобы поймать изменения размера и ориентации:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { _ in
if self.popover != nil {
// optionally scroll to popover source rect, if inside scroll view
let rect = ...
self.scrollView.scrollRectToVisible(rect, animated: false)
// update source rect constraints
buttonConstraint.constant = ...
button.setNeedsLayout()
button.layoutIfNeeded()
}
}, completion: nil)
}
Объяснение. Трюк с animate(alongsideTransition: ((UIViewControllerTransitionCoordinatorContext) -> Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Void)? = nil)
заключается в том, что вы должны обновлять свои ограничения в замыкании alongsideTransition
, а не в completion
. Таким образом вы гарантируете, что UIPopoverPresentationController имеет обновленный sourceRect при восстановлении всплывающего окна в конце вращения.
Что может показаться нелогичным, так это то, что внутри alongsideTransition
замыкания у вас уже есть новый макет, из которого вы получаете расчет ограничений.
person
Dmitry
schedule
15.10.2016
rect.initialize(CGRectMake(200, 200, 400, 400)
Правда? Если это ваш код, неудивительно, что ничего не происходит. - person matt   schedule 16.10.2016