1

在 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)
    }
} 
4

1 回答 1

0

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

if let popoverController = alert.popoverPresentationController {
    self.popoverController = popoverController
...
于 2019-09-03T13:04:33.057 回答