如何在Swift中的当前视图上呈现模态

kmi*_*las 28 xcode modal-dialog transparent ipad swift

(Xcode6,iOS8,Swift,iPad)

我正在尝试创建一个类似于Web的经典模态视图,其中对话框的外部是"灰显的".为了实现这一点,我将模态的视图的backgroundColor的alpha值设置为0.5,如下所示:

self.view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,当模态变为全屏时,将删除呈现视图.(导航控制器上的参考透明模态视图).

(这里的概念有点恼火.为什么删除基础视图?根据定义,模态出现在其他内容之上.一旦基础视图被删除,它就不再是模态了.它介于模态和推动之间过渡.瓦娃......反正..)

为了防止这种情况发生,我在父控制器的方法中设置了modalPresentationStyleto ,并在Storyboard中......但没有运气.CurrentContextviewDidLoad

    self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
    self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
Run Code Online (Sandbox Code Playgroud)

当模态变为全屏时,如何防止显示视图被删除?

tyvm ..更多信息如下.

也在故事板中,如此(演示文稿:当前上下文)

在此输入图像描述

感谢您的帮助...以下文档:

在此输入图像描述

Ris*_*kov 43

首先,删除代码中模态表示样式的所有显式设置,并执行以下操作:

  1. 在故事板中设置ModalViewController的 modalPresentation样式Over Current context

IMG1

  1. 检查Root/Presenting ViewController中的复选框 - Provide ContextDefine Context.他们似乎工作甚至没有受到控制.

  • 非常感谢,在演示VC上检查"提供上下文"和"定义上下文"使其工作.我想故事板有时会自动将视图控制器定义为"提供上下文",有时不会,这取决于视图层次结构的组织方式. (3认同)
  • 这不起作用UNTIL我"删除了模态演示样式的所有显式设置" - 这意味着如果你有类似"vc.modalPresentationStyle = UIModalPresentationStyle.CurrentContext"的东西,你需要在故事板说明生效之前删除该代码. (2认同)

Har*_*kar 16

您可以为Swift尝试此代码

 let popup : PopupVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopupVC") as! PopupVC
 let navigationController = UINavigationController(rootViewController: popup)
 navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
 self.presentViewController(navigationController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

对于使用扩展名的swift 4最新语法

extension UIViewController {
    func presentOnRoot(`with` viewController : UIViewController){
        let navigationController = UINavigationController(rootViewController: viewController)
        navigationController.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
        self.present(navigationController, animated: false, completion: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用

let popup : PopupVC = self.storyboard?.instantiateViewControllerWithIdentifier("PopupVC") as! PopupVC
self.presentOnRoot(with: popup)
Run Code Online (Sandbox Code Playgroud)


小智 13

我在你的代码中看到的唯一问题是你使用CurrentContext而不是OverCurrentContext.

所以,替换这个:

self.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.CurrentContext
Run Code Online (Sandbox Code Playgroud)

为了这:

self.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
self.navigationController.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext
Run Code Online (Sandbox Code Playgroud)


小智 9

这在 Swift 5.0 中对我有用。在身份检查器中将 Storyboard Id 设置为“destinationVC”。

@IBAction func buttonTapped(_ sender: Any) {
    let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
    let destVC = storyboard.instantiateViewController(withIdentifier: "destinationVC") as! MyViewController

    destVC.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext
    destVC.modalTransitionStyle = UIModalTransitionStyle.crossDissolve

    self.present(destVC, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)