それからちょうどポップオーバーのソースとして使用し、あなたにsourceViewボタンを制約を適用できます。
myPopoverViewController.popoverPresentationController?.sourceView = button
あなたはまた、ストーリーボードにsourceViewを設定することができますが、sourceRectをコードで設定する必要があります
myPopoverViewController.popoverPresentationController?.sourceRect = button.bounds
正しく配置するには、ポップオーバー矢印の正しいソース矩形が必要です。 これで、回転でポップオーバーを閉じる必要はありません。 UIPopoverPresentationControllerはそれを行います。 popoverの作成時にsourceView/sourceRectが設定されると、sourceViewを更新する必要はありません。
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)
}
説明:サイズと向きの変化をキャッチする
使用viewWillTransition
トリックanimate(alongsideTransition: ((UIViewControllerTransitionCoordinatorContext) -> Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Void)? = nil)
では、あなたがいないcompletion
で、alongsideTransition
閉鎖であなたの制約を更新するべきであるということです。このようにして、回転の最後にポップオーバーを復元するときに、UIPopoverPresentationControllerが更新されたsourceRectを持つようにします。
逆直観的に思われるかもしれないのは、alongsideTransition
クロージャの中に、あなたの制約計算を派生させた新しいレイアウトが既にあることです。
'rect.initialize(CGRectMake(200、200、400、400)'本当ですか?それがあなたのコードなら、何も起こっていないのは不思議ではありません。 – matt