iPhone设备上的Popover演示文稿样式-可能还可以吗?

Ted*_*opp 7 iphone popover ios swift3

我试图定义一个附加到这样的视图的弹出视图:

所需的弹出窗口外观

这是我的代码:

class MyController: UIViewController, UIPopoverPresentationControllerDelegate {

    ...

    func displaySignOut(_ sender: UIButton) {
        let vc = UIStoryboard(name: "Main", bundle: nil)
            .instantiateViewController(withIdentifier: "signOutPopover")
        vc.modalPresentationStyle = .popover
        vc.preferredContentSize = CGSize(width: 100, height: 30)
        present(vc, animated: true, completion: nil)

        let pc = vc.popoverPresentationController!
        pc.sourceView = sender
        pc.sourceRect = sender.bounds
        pc.delegate = self
    }

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

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

因为弹出窗口很小,所以我想在所有设备上使用这种样式。我已遵循通常的建议(例如,此处)来覆盖adaptivePresentationStyle返回UIModalPresentationStyle.none。

在iPad设备上可以正常使用,但在iPhone上则不能。在较小的iPhone设备上,它始终会全屏显示。在较大的屏幕(例如iPhone 7 Plus)上,出现了错误,但是,如果我在弹出窗口出现后旋转设备,则会奇怪地切换到弹出窗口演示(纵向和横向)。(如果我关闭弹窗并再次将其抬起,直到再次旋转设备,这都是错误的。)此外,在横向模式下,它会以奇怪的配置显示(不是全屏显示,如纵向):

弹出框在iPhone 7 Plus上如何以横向显示

与弹出式演示文稿不同,如果在弹出式视图本身之外点击,这不会消失。

在苹果的文档说,(部分):

在水平紧凑的环境中,UIModalPresentationOverFullScreen默认情况下,弹出框会适应演示样式。

“默认情况下”强烈建议有一种方法可以覆盖此行为。但是(与这篇文章一致),adaptivePresentationStyle在委托中的重写似乎不再是这样做的方法(尽管它曾经可以工作)。那么,有没有一种新方法可以修改默认行为?

我正在使用针对iOS 9+的XCode 8.3.3和Swift 3.1。

Hus*_*bir 5

我创建了一个自定义类,其中包含连接按钮出口的故事板并实现了以下代码。

import UIKit
class PopOverViewController: UIViewController {

    @IBOutlet weak var button: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        button.backgroundColor = UIColor.purple
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //Updating the popover size
    override var preferredContentSize: CGSize {
        get {
            let size = CGSize(width: 80, height: 60)
            return size
        }
        set {
            super.preferredContentSize = newValue
        }
    }


    //Setup the ViewController for popover presentation
    func updatePopOverViewController(_ button: UIButton?, with delegate: AnyObject?) {
        guard let button = button else { return }
        modalPresentationStyle = .popover
        popoverPresentationController?.permittedArrowDirections = [.any]
        popoverPresentationController?.backgroundColor = UIColor.purple
        popoverPresentationController?.sourceView = button
        popoverPresentationController?.sourceRect = button.bounds
        popoverPresentationController?.delegate = delegate
    }

}
Run Code Online (Sandbox Code Playgroud)

然后Inside ViewController实现了一个在iphone上显示popOver的功能

func showPopOver(button: UIButton!) {
 let viewController = PopOverViewController()
 viewController.updatePopOverViewController(button, with: self)
  present(viewController, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

注意:- 经过测试,这应该适用于纵向和横向模式