2009-09-24 113 views
0

我試圖在我的iPhone應用程序的所有屏幕上放置一個紅色色調。我對位圖進行了實驗,發現通過使用乘法(kCGBlendModeMultiply)將深紅色合成到屏幕圖像上,可以獲得我想要的效果。着色iPhone應用程序屏幕紅色

所以問題是如何有效地在iPhone上做到這一點?

一種愚蠢的方式可能是抓取當前屏幕的位圖,將其合成到位圖中,然後將合成的位圖寫回屏幕。這似乎幾乎肯定會太慢。另外,我需要知道什麼時候屏幕的一部分被重新繪製,所以我可以更新着色。

我幾乎可以通過將紅色,半透明的全屏UIView放在一切之上來獲得所需的效果。在我的進一步干預下,這一切都是紅色的,但是效果比複合材料的效果要「混亂」得多。

那麼,那裏的任何嚮導都知道一些機制,我可以使用自動將紅色的應用程序在類似的方式複合到半透明的紅色UIView?

回答

0

你可以試試這個:子類UIView。將代碼添加到-drawRect方法以繪製疊加層。讓你的UIView子類在你的應用無處不在冒充的UIView與

class_poseAs ([CustomUIView class], [UIView class]); 
+0

作爲類的姿勢已被棄用。 – PeyloW 2009-09-24 14:44:17

+0

是的,我正在研究poseAs,但正如PeyloW所說,Apple似乎不希望您再使用它。即使它不是我認爲不建議調用你原來的例程,你壓倒一切。 – btschumy 2009-09-24 16:23:47

3

我設法有點使這項工作,但有一些副作用:

  1. 我安裝我的所有應用程序的頂部一個UIView - 不是userInteractionEnabled且不透明的視圖

  2. 此UIView包含一些自定義drawRect方法,它首先用紅色填充整個區域,然後在對窗口進行「截圖」之後-viewhierarchy我呈現將此圖像與

    CGContextSetBlendMode(c, kCGBlendModeMultiply); 
    

    給UIView。

  3. 要不斷更新這個UIView到應用程序UIViews的當前狀態,我會不斷產生「截圖」並儘可能快地渲染它們。

  4. 我設置了一個NSTimer,它以定義的頻率完成快照/渲染,並將其添加到NSRunLoop中進行「跟蹤」。

  5. 結果:一些真正的來自用戶界面的延遲響應具有一些奇特效果,但如果不將快照/渲染頻率設置爲高,仍然可以使用。

在這裏看到的截圖...

enter image description here

結果看起來不錯,但實用性確實遭受了很多。在嘗試這個方法之前,我看了一下OpenGL的例子,但是OpenGL是很多不同的(大多數是C)代碼,這些代碼看起來非常接近硬件,並且讓您非常頭疼。

所以,所描述的方法是我將用我的下一個應用程序拍攝的。我希望蘋果能夠接受它,即使它在夜間模式下會降低UXP。他們應該簡單地使CALayer過濾器支持,那麼我的問題一定會得到更好的解決,並且表現很好。

+0

這真是太棒了,我迫不及待地嘗試。謝謝 :) – 2016-09-02 06:02:34