0

iPhoneアプリケーションのすべての画面に赤い色合いを付けようとしています。ビットマップを試してみたところ、Multiply(kCGBlendModeMultiply)を使用して画面イメージに濃い赤色を合成することで、必要な効果が得られることがわかりました。

では、問題は、iPhoneでこれをリアルタイムで効率的に行う方法です。

ばかげた方法の1つは、現在の画面のビットマップを取得し、そのビットマップに合成してから、合成されたビットマップを画面に書き戻すことです。これはほぼ間違いなく遅すぎるようです。さらに、色合いを更新できるように、画面の一部がいつ再描画されたかを知る方法が必要です。

赤、半透明、フルスクリーンのUIViewをすべての上に置くことで、ほぼ必要な効果を得ることができます。それは私の側のさらなる介入の範囲内ですべてを赤く染めますが、その効果はコンポジットからの結果よりもはるかに「濁っています」。

では、半透明の赤いUIViewと同じように、アプリ上で赤を自動的に合成するために使用できるメカニズムを知っているウィザードはいますか?

4

2 に答える 2

3

私は何とかこれを機能させることができましたが、いくつかの副作用がありました:

  1. userInteractionEnabled ではなく、不透明なすべてのアプリ ビュー (ウィンドウに接続されている) の上に UIView をセットアップします。

  2. このUIViewには、最初に領域全体を赤色で塗りつぶし、次にウィンドウビュー階層の「スクリーンショット」を作成した後、この画像をレンダリングするカスタム drawRect-method が含まれています

    CGContextSetBlendMode( c, kCGBlendModeMultiply);
    

    UIViewに。

  3. この UIView をアプリの UIView の現在の状態に常に更新するために、常に「スクリーンショット」を作成し、できるだけ速くレンダリングします。

  4. このスナップショット/レンダリングを定義された頻度で実行し、「追跡」のために NSRunLoop に追加される NSTimer をセットアップします。

  5. 結果: UI からの応答が非常に遅く、いくつかの派手な効果がありますが、スナップショット/レンダリングの頻度を高く設定しない限り、それでも使用できます。

ここでスクリーンショットを参照してください...

ここに画像の説明を入力

結果は問題ないように見えますが、実際にはユーザビリティが大幅に低下します。このアプローチを試す前に、OpenGL の例を見てみましたが、OpenGL は、ハードウェアに非常に近いように見えるさまざまな (ほとんどが C) コードであり、本当に頭痛の種です。

したがって、説明されているアプローチは、次のアプリで撮影するものです. 暗視モード中にUXPが低下するとしても、Appleがそれを受け入れることを願っています. 彼らは単純に CALayer をフィルタに裏打ちする必要があり、そうすれば私の問題は確実に解決され、うまく機能します。

于 2011-10-01T22:57:19.307 に答える
0

You could try this: subclass UIView. Add code to -drawRect method to draw the overlay. Make your UIView subclass pose as UIView everywhere in your app with

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