iPhone设备上的Popover演示风格 - 可能还有吗?

时间:2017-07-24 16:08:39

标签: ios iphone swift3 popover

我正在尝试定义附加到这样的视图的弹出视图:

desired popover appearance

这是我的代码:

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
    }
}

因为弹出窗口太小,我想在所有设备上使用这种风格。我已按照通常的建议(例如,here)覆盖adaptivePresentationStyle以返回UIModalPresentationStyle.none

这在iPad设备上运行良好,但在iPhone上却没有。在较小的iPhone设备上,它始终全屏显示。在较大的屏幕(例如,iPhone 7 Plus)上,它出现了错误,但奇怪的是,如果我在弹出窗口后旋转设备,则会切换到popover演示文稿(纵向和横向)。 (如果我解除弹出并重新启动它,那么在我旋转设备之前它会再次出错。)此外,在横向上它出现在一个奇怪的配置中(不像纵向那样全屏):

How the popover appears in landscape on iPhone 7 Plus

与popover演示文稿不同,如果我在弹出框视图本身之外点击,则不会忽略。

Apple documentation说(部分):

  

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

“默认情况下”强烈建议有一种方法可以覆盖此行为。但是(与this post一致),在委托中覆盖adaptivePresentationStyle似乎不再是这样做的方式(虽然它曾经起作用)。那么是否有一种修改默认行为的新方法?

我正在使用XCode 8.3.3和Swift 3.1,目标是iOS 9 +。

1 个答案:

答案 0 :(得分:4)

  

我在连接中创建了一个带有故事板的自定义类   按钮的出口并在代码下面实现。

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
    }

}
  

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

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

注意: - 经过测试,这应该适用于肖像以及风景模式