ios 9 UIPopoverPresentationController 在旋转时不断放置
Posted
技术标签:
【中文标题】ios 9 UIPopoverPresentationController 在旋转时不断放置【英文标题】:ios 9 UIPopoverPresentationController constant placement on rotation 【发布时间】:2016-09-09 15:49:13 【问题描述】:在 ios9 中,当我使用 UIPopoverPresentationController 旋转屏幕时,坐标会重置为 0,并且不会附加到作为按钮的 sourceView。
我试过了:
func popoverPresentationController(popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverToRect rect: UnsafeMutablePointer, inView 视图: AutoreleasingUnsafeMutablePointer) rect.initialize(CGRectMake(200, 200, 400, 400))
但无济于事。有什么帮助吗?
【问题讨论】:
rect.initialize(CGRectMake(200, 200, 400, 400)
真的吗?如果那是你的代码,难怪什么都没有发生。
【参考方案1】:
您可以对 sourceView 按钮应用约束,然后将其用作弹出源:
myPopoverViewController.popoverPresentationController?.sourceView = button
你也可以在storyboard中设置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
闭包中,您已经有了新的布局,您可以从中导出约束计算。
【讨论】:
以上是关于ios 9 UIPopoverPresentationController 在旋转时不断放置的主要内容,如果未能解决你的问题,请参考以下文章
iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)
iOS 8、iOS 9、iOS 10 和 iOS 11 上的 UITabBar 的高度是多少?
问题 XCode 8,Swift 2.3 存档版本在 IOS 9.2.1 -> IOS 9.0 上启动时崩溃
Xcode 9.2 不支持 iOS 11.3 的 Xcode 需要 9.3