ios 9 UIPopoverPresentationController在旋转时的常量放置

时间:2016-09-09 15:49:14

标签: ios swift uipopovercontroller

在iOS9中,当我用UIPopoverPresentationController旋转我的屏幕时,坐标被重置为0而没有附加到我的sourceView这是一个按钮。

我试过了:

func popoverPresentationController(popoverPresentationController:UIPopoverPresentationController,willRepositionPopoverToRect rect:UnsafeMutablePointer,inView视图:AutoreleasingUnsafeMutablePointer){     rect.initialize(CGRectMake(200,200,400,400)) }

但无济于事。有什么帮助吗?

1 个答案:

答案 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封闭内你已经有了新的布局,你可以从中获得约束计算。