我试过了:
func popoverPresentationController(popoverPresentationController:UIPopoverPresentationController,willRepositionPopoverToRect rect:UnsafeMutablePointer,inView视图:AutoreleasingUnsafeMutablePointer){ rect.initialize(CGRectMake(200,200,400,400)) }
但无济于事。有什么帮助吗?
答案 0 :(得分:2)
您可以将约束应用于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
封闭内你已经有了新的布局,你可以从中获得约束计算。