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

coa*_*175 19 objective-c uiviewcontroller popover ios segue

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

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

Bha*_*rat 26

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

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

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

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

在要从中触发此segue的ViewConroller中,添加UIPopoverPresentationControllerDelegate协议.

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
}
Run Code Online (Sandbox Code Playgroud)

覆盖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
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return UIModalPresentationStyle.None
    }
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

资料来源:iPhone风格的iPhone手机版采用Swift


kor*_*gx9 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
    }
Run Code Online (Sandbox Code Playgroud)


Mic*_*ais 6

感谢Bharat的出色答案,我个人使用的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
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 0

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

如果您不想自己编写,则可以使用类似的内容,例如: http: //cocoapods.org/pods/FPPopover