【问题标题】:UIVisualEffectView In LoadVIew()LoadVIew() 中的 UIVisualEffectView
【发布时间】:2017-09-26 10:40:33
【问题描述】:

我正在尝试将 visualEffect 添加到在 iOS10 和早期版本上运行良好的视图中......但在 iOS 11 上它会崩溃。错误原因如下:

 has been added as a subview to <UIVisualEffectView: 0x7feabe90d170; frame = (0 0; 375 812); layer = <CALayer: 0x6000006257c0>>. Do not add subviews directly to the visual effect view itself, instead add them to the -contentView."

我正在使用以下代码:

 override func loadView() { 
    super.loadView()

    // create the blur view
    let blurView = UIVisualEffectView(effect: effect)
    if let oldView = view {
        blurView.frame = view.frame
        oldView.translatesAutoresizingMaskIntoConstraints = false
        blurView.contentView.addSubview(oldView)
        blurView.contentView.pinParentAllDirections(oldView)
    }
    view = blurView
}

奇怪的是,当我在 viewDidload 中添加此代码时,它通过了崩溃...请任何人帮助我理解主要问题,或者我是否遗漏了 iOS11 方面的任何内容。

【问题讨论】:

    标签: ios ios11 swift4 xcode9


    【解决方案1】:

    我们不应该从loadView 函数调用super.loadView()

    https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

    如果您使用 Interface Builder 创建视图并初始化 视图控制器,你不能重写这个方法。

    我们有类似的东西,并通过将代码移出loadView 方法来修复它。因为 loadView 用于构建视图,而不是您要自定义视图的时间点。

    【讨论】:

    • 您是否尝试按照@Hani Ibrahim 的建议删除 super.loadView()?
    • 我现在做了.. 但由于某种原因它进入了 loadView() 内部的无限循环
    • 尝试创建一个新的 UIView 并将其分配给 self.view。这将解决问题。
    • 您的意思是 uiview 作为视觉对象的容器,然后将它们全部添加到根目录?
    • @hegab 我认为它进入了一个无限循环,因为在未加载视图时调用 view 可能会导致调用 loadView 来加载视图等等
    【解决方案2】:

    出于所有意图和目的,您永远不应覆盖 loadView 或自己调用它。您应该改写 awakeFromNib()viewDidLoad() 以进一步自定义您的视图,然后再将其显示在屏幕上。

    您还可以在视图出现在viewWillAppear(animated:) 中的任何位置之前对视图进行最后一秒的润色。

    【讨论】:

      最近更新 更多