CAGradientLayer 导致子视图不可见

Posted

技术标签:

【中文标题】CAGradientLayer 导致子视图不可见【英文标题】:CAGradientLayer causes subviews not being visible 【发布时间】:2016-05-24 08:20:52 【问题描述】:

您好 ios 和 Swift 大师,

经过两天令人沮丧的日子,我拼命地决定在这里问。问题:

添加 CAGradientLayer 时,不显示子视图。

详情:

我已经做了一个方法来添加一个 CAGradientLayer 在一个扩展 界面视图 我只需在任何视图上调用该方法,它本身就可以完美运行 但是,如果我尝试将此方法用于视图层次结构中的 UIView(作为背景),不幸的是,所有子视图都不再可见, 渐变似乎“过度渲染”了所有子视图 如果我不在容器视图上调用“addGradient”方法,所有子视图都会正确显示 惊人的细节:虽然子视图不可见,但它们以某种方式存在并且“活跃”(例如“不可见”的 UIButton 触发”) 我正在使用自动布局

任何想法将不胜感激! 提前致谢。

【问题讨论】:

我已经更新了我的答案并尝试使用添加了 imageView 的代码,因为 subView 对我来说效果很好。看看让我知道它是否也适合你 【参考方案1】:

卢克边行者,

不确定,但您始终可以尝试将您的图层添加到所有其他图层下方,这样它就不会覆盖现有的子视图。试试这个,在你的扩展中添加层来查看

self.layer.insertSublayer(layer, atIndex: 0)

尝试将 ImageView 添加为 subView 效果很好 :) 也应该可以解决您的问题。

【讨论】:

@lukesidewalker:令人惊讶的是,我的第一个答案提到了同样的问题,要求您在下面使用 :) 但是当我尝试自己运行代码时,它可以正常工作。但是将索引指定为 0 就可以了:) 尝试使用 "self.layer.insertSublayer(layer, atIndex: 0)" 而不是 addSublayer 或 insertSublayer(layer,below:___) 看我更新的答案:) 你拯救了我的一天! :)))) -> 我会接受这个作为正确答案。我不知道它为什么有效,但它有效,如果你顺便有一个解释会很好,只是为了理解不仅仅是实现它。谢谢,也祝你有美好的一天:) @lukesidewalker :很高兴我能帮助哥们 :) 老实说,即使我不知道为什么下面不起作用 :) 事实上,我尝试在下面使用所有可能的排列和组合,比如先添加 subView然后是层,先层,然后是 subView din 工作,最后不得不使用索引 0,因为它按照它所说的 :) 并且幸运地工作了 :) 希望通过答案的人能够指导我们为什么它 din 工作:) 【参考方案2】:

我之前遇到过类似的问题,并通过在我的视图中添加背景视图解决了这个问题。所以视图层次结构如下:

view
  backgroundView
  someView
    someViewInsideView
  someOtherView

顶视图 alpha 似乎也会影响子视图的 alpha。因此,我使用具有清晰背景颜色的视图并使用 backgroundView 为视图的背景颜色和其他带有 alpha 修饰符的属性。

【讨论】:

感谢 Murat,我会试试这个,但目前我无法想象它应该如何工作,因为问题似乎是一样的,虽然另一个视图被带到视图层次结构中...... 据我了解,问题是当您修改根视图时,所有子视图都会受到相同的 alpha 修饰符的影响。所以你的子视图没有正确显示。我的建议是你应该只修改 backgroundView (在这种情况下添加渐变层)并保持根视图不变。其他视图不会与 backgroundView 共享任何修饰符,因此它们将不受影响。 再次感谢,特别是您最后的解释。如您所见,Sandeep 已经给了我一个完美的解决方案。

以上是关于CAGradientLayer 导致子视图不可见的主要内容,如果未能解决你的问题,请参考以下文章

获取作为子视图添加的 UIView 的可见矩形

Objective C:如何在当前可见帧中设置子视图显示? (UITableView)

子视图永远不可见

CAGradientLayer:其他 UIObjects 没有出现

XIB 子视图不可见

Xcode - 子视图不可见