Popoverview 未以 iPad 旋转为中心

Popoverview is not centred on iPad rotation

在下面的代码中,当 iPad 旋转时,iPad 上的弹出窗口不会以第二个警报(城市)为中心。不过,它适用于第一次警报(国家)。我已经打印了值,两个警报都相同。似乎尽管具有正确的坐标值,但它并没有在设备旋转的中心显示第二次警报。

为什么它不在中心显示第二次警报?如何解决?

class MyVC: UIViewController {

    var popoverController:UIPopoverPresentationController?

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)

        self.tableView.reloadData()

        if self.popoverController != nil {
            popoverController?.sourceView = self.view
            print("viewWillTransition():width: x: \(UIScreen.main.bounds.size.width*0.5), y: \(UIScreen.main.bounds.size.height*0.5)")
            popoverController?.sourceRect = CGRect(x: UIScreen.main.bounds.size.width*0.5, y: UIScreen.main.bounds.size.height*0.5, width: 0, height: 0)
            popoverController?.permittedArrowDirections = []
        }
    }

    @IBAction func countryButtonClicked(_ sender: UIBarButtonItem) {
        displayCountries()
    }

    func displayCountries() {
        let alert = UIAlertController(title: "", message: "", preferredStyle: .actionSheet)

        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.alignment = .center

        let titleAttributedText = NSMutableAttributedString(
            string: "Select Country",
            attributes: [
                NSAttributedString.Key.paragraphStyle: paragraphStyle
            ]
        )
        alert.setValue(titleAttributedText, forKey: "attributedMessage")
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: countryHandler))

        for list in Countries {
            alert.addAction(UIAlertAction(title: list, style: .default, handler: countryHandler))
        }

        // For iPad
        if let poController = alert.popoverPresentationController {
            popoverController = poController
            popoverController?.sourceView = self.view

            print("displayCountries():width: x: \(UIScreen.main.bounds.size.width*0.5), y: \(UIScreen.main.bounds.size.height*0.5)")
            popoverController?.sourceRect = CGRect(x: UIScreen.main.bounds.size.width*0.5, y: UIScreen.main.bounds.size.height*0.5, width: 0, height: 0)
            popoverController?.permittedArrowDirections = []
        }

        alert.view.addSubview(UIView())
        present(alert, animated: false, completion: nil)
    }

    @IBAction func cityButtonClicked(_ sender: Any) {
        showCities()
    }

    func showCities(){
        let alert = UIAlertController(title: "Select City", message: nil, preferredStyle: .actionSheet)

        for listItem in Cities {
            alert.addAction(UIAlertAction(title: listItem.title, style: .default, handler: cityHandler))
        }
        alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertAction.Style.cancel, handler: cityHandler))

        if let popoverController = alert.popoverPresentationController {
            popoverController.sourceView = self.view
            print("showCities():width: x: \(UIScreen.main.bounds.size.width*0.5), y: \(UIScreen.main.bounds.size.height*0.5)")
            popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.size.width*0.5, y: UIScreen.main.bounds.size.height*0.5, width: 0, height: 0)
            popoverController.permittedArrowDirections = []
        }

        alert.view.addSubview(UIView())
        present(alert, animated: false, completion: nil)
    }
} 

popoverController 也必须在第二个警报中分配:

if let popoverController = alert.popoverPresentationController {
    self.popoverController = popoverController
...