首页 > 解决方案 > CALayer 或其他技术来实际修改后面图层的颜色,就像剪裁一样

问题描述

总结一下,在 iOS 中如何有一个视图来修改它后面所有视图的像素。


假设您有一个视图,任何视图,但让我们考虑一个恰好是一些色块的集合视图:

在此处输入图像描述

假设我们在顶部添加了一个视图CleverView,它要么只是阻止该视图(所以,白 - 微不足道),甚至在该层“切一个洞”(相对容易做到,谷歌)。

到目前为止没问题:所以这里的 CleverView 只是一个白色方块:

在此处输入图像描述

但是如果我们想这样做怎么办:

在此处输入图像描述

CleverView 正在改变它下面的所有饱和度,

或者也许是这样:

在此处输入图像描述

CleverView 正在改变色调或它下面的任何东西。

请注意,在示例中它以像素方式工作,它不是(“只是”)标记每个集合视图单元格以更改所有单元格颜色。

所以理想情况下,CleverView 会对它后面发生的任何事情执行此操作(即,它覆盖或部分覆盖的任何一堆视图,因此集合视图示例只是“许多视图”)。

自然地,下面的东西和 CleverView 的形状都可以实时动画、移动。

有没有办法在iOS中完成?

(在那个具体的例子中,我所做的只是,有两个集合视图:底部的一个和顶部的具有新的颜色值。只需小心地剪辑顶部的一个即可达到效果。但显然这不是聪明的作为实际上“修改其后面所有像素的值”的视图。)

{还要注意,很明显,您基本上可以只制作一个屏幕截图,然后显示该图像并显示它;不是一个很好的解决方案。}

标签: iosuikitcalayer

解决方案


CALayer有一个属性backgroundFilters,您通常可以在其中添加一个可以完成这项工作的属性CIFilter。但是,文档指出

特殊注意事项 iOS 中的图层不支持此属性。

这很烦人,但这就是我们所拥有的。可能是出于性能考虑。

我建议研究一下SceneKit,那里的原语与 非常相似CoreAnimation,也可以动画CAAnimation化,但提供了高级工具来配置和控制渲染的更多方面。

例如SCNNodefiltershttps ://developer.apple.com/documentation/scenekit/scnnode/1407949-filters?language=objc


推荐阅读