【问题标题】:Adding a blur effect on a View Controller after segueing from it to another one modally模态地从视图控制器转移到另一个视图控制器后,在视图控制器上添加模糊效果
【发布时间】:2018-07-13 02:37:28
【问题描述】:

我有一个包含按钮的视图控制器 (vc1)。该按钮以模态方式显示另一个视图控制器 (vc2)。 segue 的presentation style 设置为over current context

我还以编程方式在 vc1 上创建了一个 UIVisualEffectView(它涵盖了整个 vc1view)。

现在,我需要将视觉效果的效果设置为UIBlurEffect,但是在模态显示vc2 之后(其中viewbackgroundColour 设置为clear,所以vc1 仍然是在vc2 后面可见)。

是否可以在无需编写自定义视图控制器转换的情况下实现,如果可以,如何实现?如果您知道如何执行此操作,我将不胜感激任何帮助或建议。

【问题讨论】:

  • 虽然这是我的一个小烦恼,我不想发表评论,但我认为这可能会帮助你看看你的 cmets 的答案 @尼西。请记住,view controllerview 之间的区别。您将模糊效果应用于视图控制器 - 但很多时候您将其应用于视图。在代码中,您创建了一个UIVisualEffectView(注意,不是 控制器)并向其内容添加子视图。所有视图控制器都有一个“根”视图——在代码中,通常(但不总是)self.view。请注意,在答案的代码中,它解决了这个问题 - 而不是视图控制器。
  • @dfd,感谢您的澄清

标签: ios swift uiviewcontroller uistoryboardsegue


【解决方案1】:

默认情况下,iOS 中不会出现模糊过渡。所以你需要自定义代码。
一个简单的解决方案是添加一个子视图:

在过渡到 vc2 时添加以下代码:

let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
blurEffectView = UIVisualEffectView(effect: blurEffect)    // Global variable
blurEffectView.frame = view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.view.addSubview(blurEffectView)

NotificationCenter.default.addObserver(self, selector: #selector(self.removeBlurView), name: NSNotification.Name(rawValue: "removeBlurView"), object: nil)  

去除模糊视图的功能(在vc1中):

func removeBlurView()
{
    NotificationCenter.default.removeObserver(self)
    blurEffectView.removeFromSuperview()
}  

当您关闭 vc2 时,在 vc2 中添加以下内容:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "removeBlurView"), object: nil)

Ray's tutorial 和密切相关的tutorial 中所述,还有其他方法可以实现此目的

【讨论】:

  • 感谢您的回答和教程链接(我现在无法查看,但我会在今天晚些时候查看)。关于您的回答:我添加了模糊过渡,就像您在上面的代码中所做的那样。现在,当vc2 显示在vc1 之上时,我尝试让它触发,我只是不知道如何调用它,让它在正确的时间触发。 viewWillDisappearviewDidDisappear 方法没有被调用,因为我在当前上下文中以模态方式显示其他 vc,所以我试图找出在哪里可以调用它。
  • 打开vc2时调用。同时创建删除模糊视图的通知。然后,当您关闭 vc2 时,发布该通知,模糊视图将被删除。
  • 那么,我说得对吗,您将模糊添加到 vc2
  • 我刚刚更新了我的答案以指明您应该遵循的步骤。
  • @TigranIskandaryan:有帮助吗?
【解决方案2】:

您可以使用子 ViewController 机制。

let vc2 = VC2()

vc1.addChildViewController(vc2)
vc2.view.frame = vc1.view.frame

vc1.view.addSubview(vc2.view)
vc2.didMove(toParentViewController: vc1)

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多