CAGradientLayer导致子视图不可见。

3

大家好,这篇文章是关于iOS和Swift的。

经过两天的挫败感,我决定在这里求助。问题如下:

当添加一个CAGradientLayer时,子视图不会显示。

详细信息如下:

  • 我已经创建了一个UIView的扩展方法来添加CAGradientLayer
  • 我仅需在任何视图上调用该方法,它本身就能完美地运行
  • 但如果我尝试将此方法用于视图层次结构中的UIView(作为背景),那么所有子视图都不能再被看到,渐变似乎“覆盖”了所有子视图
  • 如果我不在容器视图上调用“addGradient”方法,则所有子视图都会正确显示
  • 神奇的细节:虽然子视图不可见,但它们仍然存在并且“活跃”(例如,“不可见”的UIButton会触发事件)
  • 我正在使用Autolayout

希望得到您的任何想法! 提前致谢。


我已经更新了我的答案,并尝试使用添加了imageView的代码作为子视图,对我来说效果很好。看一下,如果对你也起作用,请让我知道。 - Sandeep Bhandari
2个回答

12

LukeSideWalker,

我不确定,但你可以尝试把你的图层添加在所有其他图层之下,这样它就不会覆盖现有的子视图。在你添加图层到视图的扩展中尝试这个方法:

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

尝试将 ImageView 添加为子视图,效果很好 :) 这也应该解决你的问题。


@lukesidewalker:令人惊讶的是,我的第一个答案提到了同样的内容,建议你使用以下代码 :) 但是当我自己尝试运行代码时,它没有起作用。但是指定索引为0就解决了问题 :) - Sandeep Bhandari
尝试使用 "self.layer.insertSublayer(layer, atIndex: 0)" 而不是 addSublayer 或 insertSublayer(layer,below:___),请查看我的更新答案 :) - Sandeep Bhandari
你救了我的一天!:)))) -> 我会接受这个作为正确答案。我不知道它为什么有效,但它确实有效,如果你恰好有一个解释,那将很好,只是为了理解而不仅仅是实施它。谢谢,也祝你度过愉快的一天 :) - LukeSideWalker
@lukesidewalker:很高兴我可以帮到你,伙计 :) 说实话,连我也不知道下面的代码为什么无法正常运行 :) 实际上,我尝试了所有可能的排列组合,如先添加子视图(subView),再添加层(layer),或者先添加层(layer),再添加子视图(subView),都不能正常工作。最后只好使用索引0,因为它实现了预期的效果 :) 幸运的是,这个方法最终成功了 :) 希望通过查看答案的人能够指导我们为什么它无法正常工作 :) - Sandeep Bhandari

0

我之前遇到过类似的问题,通过给我的视图添加一个背景视图来解决了这个问题。因此,视图层次结构应该是这样的:

view
  backgroundView
  someView
    someViewInsideView
  someOtherView

顶部视图的透明度似乎也会影响子视图的透明度。因此,我使用一个背景颜色为透明的视图,并使用backgroundView来给视图设置背景颜色和其他带有alpha修饰符的属性。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接