【问题标题】:Why is 'present as popover' segue covering the whole screen?为什么'present as popover' segue 覆盖整个屏幕?
【发布时间】:2015-09-22 04:01:47
【问题描述】:

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

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

【问题讨论】:

  • 尝试将目标 ViewController 上的 modalPresentationStyle 设置为 UIModalPresentationPopover
  • 您是用 ipad 还是 iphone 进行测试? Popover 不适用于 iphone。
  • 哦,我正在 iphone 上尝试。如何在 iphone 上获得这种效果?
  • iPhone 上的弹出窗口是全屏的。在 iPad 上不是全屏。
  • 对我来说问题是,通过“PerformSegue”调用 PopoverViewController 总是让它​​全屏显示。删除storyboard segue并手动组装并通过presentViewController显示即可解决。

标签: ios segue popover


【解决方案1】:

OP 使用 Objective-C。这个答案迅速呈现代码。将 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 {
}

重写 prepareForSegue 函数来捕捉你的弹出框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 设置的大小。

来源:iPad Style Popovers on the iPhone with Swift

【讨论】:

  • 这对我有用,但我发现弹出框忽略了视图大小,只是给了我一个随机大小,就像屏幕大小的 1/3。
  • 啊,解决了。我必须选中“使用首选显式大小”框
【解决方案2】:

感谢Bharat for the great answer,我个人使用的 UIStoryboardSegue 几乎完成了同样的事情。这样,我可以在故事板中更改 segue 的类,拥有我想要的,并且不会污染我的控制器:

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】:

Swift 3-5 版本

    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
    }
    

【讨论】:

    【解决方案4】:

    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
        }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-09
          • 1970-01-01
          • 2014-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多