旋转时弹出视图位置错误的位置

Popover View positions to wrong place when rotated

提问人:Collin Zhang 提问时间:5/8/2020 更新时间:9/7/2023 访问量:788

问:

我可能会尝试将弹出框居中并使其在旋转后仍然居中。这项研究几乎回答了我的问题。但是,我注意到一个非常奇怪的问题:当我在设备纵向时启动弹出框时,它首先会很好地居中,但是,如果我旋转到横向,然后再次将其旋转到纵向,它比中心位置高一点。我通过截图制作了一张图片来显示这一点

comparison between before and after

左边的截图是右边的位置,先启动弹出框时出现,右边的截图是错误的位置,通过我画的线可以清楚地看到它们之间的区别。

这是我用来使弹出窗口居中的代码

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        if let controller = self.presentedViewController as? PopoverController {
            controller.popoverPresentationController?.sourceRect = CGRect(x: size.width / 2,
                                                                          y: size.height / 2,
                                                                          width: 0, height: 0)
            let globalPoint = controller.view.superview?.convert(controller.view.frame.origin, to: nil)
            controller.label.text = "x: \(globalPoint!.x), y: \(globalPoint!.y)"
            self.view.layoutIfNeeded()
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "popoversegue" {
            let controller = segue.destination
            controller.popoverPresentationController!.delegate = self
            controller.popoverPresentationController!.sourceRect = CGRect(x: view.center.x, y: view.center.y,
                                                                          width: 0, height: 0)
            controller.popoverPresentationController?.sourceView = self.view
            controller.preferredContentSize = CGSize(width: 500, height: 600)
            controller.popoverPresentationController!.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
        }
    }

此外,我意识到问题只发生在纵向方向,弹出框总是在横向位置居中。这里可能有什么问题?

iOS Swift UIPopOverController UIPopOverPresentationController

评论


答:

2赞 Shashank Mishra 5/9/2020 #1

使类符合“UIPopoverPresentationControllerDelegate”

然后添加以下代码。我已经尝试过并且工作正常。

func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController, willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>, in view: AutoreleasingUnsafeMutablePointer<UIView>) {
        let viewFrame = popoverPresentationController.presentingViewController.view.frame
        let deltaX = viewFrame.height - rect.pointee.midX
        rect.pointee = CGRect(x: viewFrame.width - deltaX, y: rect.pointee.maxY, width: 0, height: 0)
    }

评论

0赞 Collin Zhang 5/9/2020
这是我遇到的另一个问题,我已将MainViewController设置为popoverPresentationController的委托,并且我实现了popoverPresentationController(_:willRepositionPopoverTo:in:)方法,但是当我旋转设备时没有触发它。