【问题标题】:CALayer's backgroundFilters doesn nothing on UIViewCALayer 的 backgroundFilters 在 UIView 上没有任何作用
【发布时间】:2013-04-27 16:30:36
【问题描述】:

我正在尝试将 CIFilter 添加到 CALayer 的 backgroundFilters 属性中,以让它在 UIView 中绘制。因此我将CALayer 子类化并在init 中执行以下操作:

CIFilter* blur = [CIFilter filterWithName:@"CIGaussianBlur"];
[blur setDefaults];
[blur setValue:@(10) forKey:@"inputRadius"];
self.backgroundFilters = @[ blur ];

然后我创建了一个UIView 的子类,通过返回+[UIView layerClass] 中的图层类,将这个自定义图层作为图层。

这样可以了,上面的代码已经执行了!

但是,如果我将此视图放置在 UIImageView 上方,我希望图像在放置此视图的位置绘制得模糊。但事实并非如此!该视图的行为就像一个常规视图,并采用我设置为它的backgroundColor 属性的任何颜色/alpha 值,但我只看到底层UIImageView 原样,没有模糊!

【问题讨论】:

标签: ios ios6 calayer


【解决方案1】:

CALayer 的 backgroundFilters 在 UIView 上什么都不做的原因是不幸的是 iOS 中的图层不支持 backgroundFilters 属性。它在inside the documentation 里面,在描述的最后:

特殊注意事项

在中的图层上不支持此属性 iOS。

我自己尝试插入 UIView 时被它咬了,这会模糊它背后的内容。要在 iOS 上模糊视图,似乎还需要做一些工作(复制图像中的 UIViews 内容,然后模糊并显示图像)。

【讨论】:

  • 是的,过了一会儿我自己发现了。抱歉我没有更新这篇文章。我写了一篇关于这个问题的博客文章以及一个小的开源组件:ios-coding.com/bcblurview-drawing-glass-like-views
  • 然而,在同一份文档的顶部,它在“可用性”部分中声明:iOS 2.0+
【解决方案2】:

我认为这是预期的行为。

来自docs

背景过滤器会影响显示层后面的内容 通过进入层本身。通常,此内容属于 充当图层父级的超级图层。

我的解释是,这些过滤器只会影响包含它们的视图中的内容。

【讨论】:

  • 但是layer的superlayer是views superview的layer?实际上这正是我认为这会起作用的原因?
  • 图层只属于一个视图。该视图将被过滤掉。
  • 但是CALayer 对创建它的UIView 一无所知。它所知道的是,它附加了一个superlayer。该层不应该关心这个superlayer 是否由另一个UIView 实例创建!?
  • However if I place this view above a UIImageView 如果我错了,请纠正我,但是您的 UIView 子类带有过滤器。这行得通。现在你把你的 UIView 放在 UIImageView 上,你希望 UIImageView 模糊,对吧?这不起作用,因为您的过滤器包含在您的 UIView 中。它对 UIImageView 一无所知,不会影响它。
猜你喜欢
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2021-08-16
相关资源
最近更新 更多