【问题标题】:Stacking UIViews with blend modes in iOS在 iOS 中使用混合模式堆叠 UIView
【发布时间】:2012-12-18 09:49:30
【问题描述】:

我有两个不同的UIImageViews。我想使用屏幕混合模式将顶部 UIImageView 与底部 UIImageView 混合。

我知道CALayer:compositingFilter 的属性,并且我知道它在iOS 中不起作用。我搜索了很多解决方案,我发现应该如何继承 UIView 并覆盖 drawRect

我尝试将drawRect 中的上下文设置为屏幕混合模式,尽管它仍能正常绘制每一幅图像。也许我做错了什么,或者方法应该不同。也许我需要 OpenGL 或 CALayer 来实现这一点。有人可以帮忙吗?

【问题讨论】:

  • 发布您的代码。此外,您将不得不在一个视图中绘制两个图像;您不能将一个视图与另一个视图的内容混合。
  • @KurtRevis 我知道我可以使用屏幕在一个 UIView 中绘制两个图像,这是 drawRect 中的基本绘图。我需要在视图之间进行。如果它现在不存在,请将其发布为答案,以便我可以关闭问题。

标签: objective-c ios xcode uiview calayer


【解决方案1】:

不幸的是,没有办法在 iOS 上的 UIView 之间进行非复合混合。 UIKit 不提供该功能,并且您已经注意到,CALayer 也无法提供。

一般来说,在 UIView 中实现 -drawRect 对您没有帮助。您正在绘制一个空位图——它不包含其后面的视图位,因为这些位可能随时更改(任何视图或图层都可能是动画的)。 CA 从根本上假设层的内容应该相互独立。

可以试试,在你的-drawRect:

  1. 创建图像上下文
  2. 使用-[CALayer renderInContext:]为每个视图捕获视图下的视图
  3. 从图像上下文创建图像
  4. 将该图像绘制到您的视图中
  5. 设置混合模式并在此基础上绘图

但这将是缓慢而脆弱的,并且如果您为任何视图设置动画,则将无法正常工作。我不会推荐它。

如果您真的需要这样做,您将不得不切换整个场景以使用 OpenGL 进行渲染,where you've got more freedom

【讨论】:

  • 是否有某种方法可以将 OpenGL 视图添加到场景中以允许您在其上合成内容?或者您可以在屏幕外渲染,将其捕获为纹理,然后使用 OpenGL 绘制场景?
  • UIViews 的屏幕外渲染必须使用-[CALayer renderInContext:],就像我描述的那样。但是,是的,您可以将其绘制到您的 OpenGL 上下文中,然后在其上混合内容。相同的缺点列表。
  • 这个答案与什么版本的 iOS 相关?
猜你喜欢
  • 2023-03-18
  • 2011-08-15
  • 2019-05-28
  • 2022-12-13
  • 1970-01-01
  • 2021-05-23
  • 2012-06-02
  • 2015-06-14
  • 1970-01-01
相关资源
最近更新 更多