为什么“呈现为popover”segue覆盖整个屏幕?

时间:2015-07-04 14:13:15

标签: ios objective-c uiviewcontroller segue popover

在我的项目中,我在屏幕右下方有一个按钮,我在故事板上添加了另一个uiviewcontroller,控制 - 拖动到我想要的uiviewcontroller作为popover,然后将viewcontroller大小设置为(300,300 )并选中'使用首选显式大小'。当我加载应用程序并单击按钮时,整个屏幕将被“弹出窗口”覆盖。我也尝试进入popoverViewController的.m文件并设置大小,但这也不起作用。
有什么想法吗?

编辑:因为看起来我必须让它是全屏的,但是我还在遇到我之前遇到的其他一些问题。我的弹出屏幕会出现,我将背景设为黑色,alpha设为.5使其透视然而它会完成动画,然后一旦动画完成,屏幕将从.5不透明度变为完全黑色而且是唯一的我能看到的是电池图标。

6 个答案:

答案 0 :(得分:25)

OP使用Objective-C。这个答案提供了swift中的代码。将swift转换为Objective-C应该很容易。

在新添加的ViewController中,在“Simulated Metrics”下将“Size”更改为“Freeform”,将“Status Bar”更改为“None”。

在“模拟大小”下,将视图的高度和宽度更改为您希望弹出窗口内容的实际大小。

为新添加的VC创建一个segue。使用segue类型作为"作为Popover"并给出segue的名称,例如" popoverSegue"。

在触发此segue的ViewConroller中,添加UIPopoverPresentationControllerDelegate协议。

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
}

重写prepareForSegue函数以捕获popover segue。将modalPresentationStyle设置为.Popover以显式声明您想要一个弹出框,然后将视图的popoverPresentationController的委托属性分配给self:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "popoverSegue" {
            let popoverViewController = segue.destinationViewController as! UIViewController
            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

实现adaptivePresentationStyleForPresentationController函数,告诉你的应用你真的想要那个popover演示文稿并且不接受任何替换:

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }

在这些之后,我可以在iPhone上弹出一个不是全屏但是为ViewController设置的大小的弹出窗口。

enter image description here

来源:iPad Style Popovers on the iPhone with Swift

答案 1 :(得分:6)

Swift 3版本

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == SEGUE_IDENTIFIER {
            let popoverViewController = segue.destination as! YourViewController

            popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
            popoverViewController.popoverPresentationController!.delegate = self
        }
    }

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

答案 2 :(得分:6)

感谢Bharat for the great answer,我个人使用的UIStoryboardSegue几乎完全相同。这样,我可以在故事板中更改segue的类,拥有我想要的,而不是污染我的ViewControllers:

class AlwaysPopupSegue : UIStoryboardSegue, UIPopoverPresentationControllerDelegate
{
    override init(identifier: String?, source: UIViewController, destination: UIViewController)
    {
        super.init(identifier: identifier, source: source, destination: destination)
        destination.modalPresentationStyle = UIModalPresentationStyle.popover
        destination.popoverPresentationController!.delegate = self
    }
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.none
    }
}

答案 3 :(得分:1)

Swift 4版本

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "SegueIdentifier" {
            let popoverViewController = segue.destination
            popoverViewController.modalPresentationStyle = .popover
            popoverViewController.presentationController?.delegate = self
     }
}

别忘了添加

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

答案 4 :(得分:0)

在iPhone上,您可以创建一个可以管理所有弹出窗口的自定义视图控制器。由于每个视图控制器都有自己的导航控制器,因此您可以将新的视图控制器添加到app.window.rootviewcontroller作为du视图,并将所有视图控制器置于最前面。

如果你不想自己编写,你可以使用类似的东西:http://cocoapods.org/pods/FPPopover

答案 5 :(得分:0)

这是Swift 5代码,上面提到的一些/大多数解决方案都是有效的。这是呈现整个解决方案的一种努力。本示例假定您将xib用于弹出视图控制器,但是在准备segue时也可以使用。这是完整的代码:

展示ViewController:

let popoverVC = PopoverVC(nibName: "popoverVC", bundle: nil)
popoverVC.completionHandler = { [unowned self] (itemIndex : Int?) in
    if let itemIndex = itemIndex
    {
         // Do completion handling
    }
}

popoverVC.preferredContentSize = CGSize(width: 200, height: 60)
popoverVC.modalPresentationStyle = .popover

if let pvc = popoverVC.popoverPresentationController {
    pvc.permittedArrowDirections = [.down]
    pvc.delegate = self
    pvc.sourceRect = button.frame
    pvc.sourceView = button // Button popover is presented from
    present(popoverVC, animated: true, completion: nil)
}

这很重要:

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