How to make UIPopoverController keep same position after rotating?

前端 未结 13 1127
粉色の甜心
粉色の甜心 2021-01-30 18:21

I can\'t keep popover the same position on the screen after rotation. Is there any good way to do that, because just setting some frame to popover works terrible after rotating.

13条回答
  •  [愿得一人]
    2021-01-30 18:48

    I have popoverPresentationController that I present on a view that has a "fake" nav bar. So I can't attach the popoverPresentationController to a barButtonItem. My popup appears in the right place but does not when the screen rotates.

    So for some reason popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverTo rect: UnsafeMutablePointer, in view: AutoreleasingUnsafeMutablePointer) does not get called for me.

    To work around this (iOS 12, Swift 4.2) I added constraints to the popup in the completion closure when calling present. Now my popup stays where I would expect it too.

                    present(viewController, animated: true) { [weak self] in
                DDLogDebug(String(describing: viewController.view.frame))
                if let containerView = viewController.popoverPresentationController?.containerView,
                let presentedView = viewController.popoverPresentationController?.presentedView,
                let imageView = self?.headerView.settingsButton {
                    withExtendedLifetime(self) {
                        let deltaY:CGFloat = presentedView.frame.origin.y - imageView.frame.maxY
                        let topConstraint = NSLayoutConstraint.init(item: presentedView, attribute: .top, relatedBy: .equal, toItem: imageView.imageView, attribute: .bottom, multiplier: 1, constant: deltaY)
                        topConstraint?.priority = UILayoutPriority(rawValue: 999)
                        topConstraint?.isActive = true
                        let heightContraint = NSLayoutConstraint.init(item: presentedView, attribute: .height, relatedBy: .equal, toItem: containerView, attribute: .height, multiplier: 0.75, constant: -deltaY)
                        heightContraint?.isActive = true
                        let leftConstraint = NSLayoutConstraint.init(item: presentedView, attribute: .left, relatedBy: .equal, toItem: containerView, attribute: .left, multiplier: 1, constant: presentedView.frame.origin.x)
                        leftConstraint.isActive = true
                        let widthConstraint = NSLayoutConstraint.init(item: presentedView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: presentedView.frame.width)
                        widthConstraint.isActive = true
                        presentedView.translatesAutoresizingMaskIntoConstraints = false
                    }
                }
            }
    

提交回复
热议问题