iPhone 10上的UIPopoverPresentationController与iOS 10

moh*_*hak 3 iphone uipopovercontroller ios swift

我正在尝试将ViewController显示为iPhone上的弹出窗口.我已经在SO和其他网络上找到了几个答案,但到目前为止还没有.我写了一个简单的应用程序来测试它.

ViewController.swift:

import UIKit

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(clicked(_:)))
    }

    func clicked(_ sender: Any) {
        let vc = UIViewController()
        vc.view.backgroundColor = UIColor.blue
        vc.preferredContentSize = CGSize(width: 200, height: 200)
        vc.modalPresentationStyle = .popover
        present(vc, animated: true, completion: nil)

        let ppc = vc.popoverPresentationController
        ppc?.permittedArrowDirections = .any
        ppc?.delegate = self
        ppc?.barButtonItem = navigationItem.rightBarButtonItem
    }

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }

    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
    }
}
Run Code Online (Sandbox Code Playgroud)

故事板有一个嵌入在NavigationController中的空ViewController.

运行这个,我希望弹出窗口控制器显示在"完成"按钮下.相反,蓝色视图控制器全屏显示.

有没有办法改变这种行为?

Cha*_*rde 8

您在呈现视图后连接委托.它将如何从委托返回.并显示为popover.用这个 :-

    func clicked(_ sender: Any) {

        let vc = UIViewController()
        vc.view.backgroundColor = UIColor.blue
        vc.modalPresentationStyle = .popover

        vc.preferredContentSize = CGSize(width: 200, height: 200)

        let ppc = vc.popoverPresentationController
        ppc?.permittedArrowDirections = .any
        ppc?.delegate = self
        ppc?.barButtonItem = navigationItem.rightBarButtonItem
        ppc?.sourceView = sender

        present(vc, animated: true, completion: nil)

    }
Run Code Online (Sandbox Code Playgroud)