0

我正在尝试在我的 iPhone 应用程序的所有屏幕上添加红色调。我在位图上进行了实验,发现我通过使用 Multiply (kCGBlendModeMultiply) 将深红色合成到屏幕图像上来获得我想要的效果。

所以问题是如何在 iPhone 上实时高效地做到这一点?

一种愚蠢的方法可能是获取当前屏幕的位图,合成到位图中,然后将合成的位图写回屏幕。这似乎几乎肯定会太慢。此外,我需要某种方式知道何时重绘了屏幕的一部分,以便更新着色。

我几乎可以通过在所有内容上方放置一个红色、半透明、全屏的 UIView 来获得我想要的效果。在我的进一步干预中,这会将所有东西都染成红色,但效果比复合材料的结果要“浑浊”得多。

那么那里的任何向导是否知道我可以使用某种机制以类似于半透明红色 UIView 的方式在应用程序上自动合成红色?

4

2 回答 2

3

我设法在某种程度上完成了这项工作,但有一些副作用:

  1. 我在我的所有应用程序视图(附加到窗口)之上设置了一个 UIView,它不是 userInteractionEnabled 并且是不透明的

  2. 这个 UIView 带有一些自定义的 drawRect 方法,它首先用红色填充整个区域,然后在对我的窗口视图层次结构进行“截图”之后,我正在渲染这个图像

    CGContextSetBlendMode( c, kCGBlendModeMultiply);
    

    到 UIView。

  3. 为了不断将此 UIView 更新为应用程序 UIViews 的当前状态,我不断生成“屏幕截图”并尽可能快地渲染它们。

  4. 我设置了一个 NSTimer,它以定义的频率进行快照/渲染,并将其添加到 NSRunLoop 中以进行“跟踪”。

  5. 结果:来自 UI 的一些非常滞后的响应具有几个精美的效果,但如果您不将快照/渲染的频率设置为高,仍然可以使用。

在此处查看屏幕截图...

在此处输入图像描述

结果看起来还不错,但可用性确实受到很大影响。在尝试这种方法之前,我查看了 OpenGL 示例,但 OpenGL 是一大堆不同的(主要是 C)代码,它们似乎非常接近硬件,这让你非常头疼。

因此,所描述的方法是我将在我的下一个应用程序中所追求的。我希望 Apple 接受它,即使它在夜视模式下会降低 UXP。他们应该简单地使 CALayer 过滤器支持,然后我的问题肯定会得到更好的解决并且表现得很好。

于 2011-10-01T22:57:19.307 回答
0

你可以试试这个:子类 UIView。将代码添加到 -drawRect 方法以绘制叠加层。使您的 UIView 子类在您的应用程序中随处可见

class_poseAs ([CustomUIView class], [UIView class]);
于 2009-09-24T13:46:31.537 回答