1

以下を達成するために、UIView にマスキング効果を作成したいと思います。画面に封印されたボックスを表示し、ユーザーはその画像 (UIView) の背後にあるものを明らかにするために画面に触れる (スクラッチ) ことができます。結果の上にあるカバー素材を引っ掻くと思われる宝くじに似たもの..

誰かが私を正しい方向に向けることができれば最高ですが、これをどのように開始すればよいかわかりません...

ありがとう

4

2 に答える 2

7

遅れてすみません。役立つサンプルコードをいくつか作成しました: https://github.com/oyiptong/CGScratch

drawonward のアプローチが機能します。

于 2011-01-11T19:55:02.737 に答える
2

通常、ピクセルの編集は CGBitmapContext で行われます。この場合、スクラッチ領域のアルファ チャネルのみを表すグレースケール ビットマップを作成する必要があると思います。ユーザーがスクラッチすると、このビットマップにペイントします。

GCBitmapContext をイメージのマスクとして使用するには、まずビットマップからマスキング イメージを作成する必要があります。CGImageMaskCreate を使用して、ビットマップの作成に使用したのと同じピクセルを指すデータ プロバイダーを渡します。次に、スクラッチ オフ イメージとビットマップであるマスク イメージで CGImageCreateWithMask を使用します。

iPhone で直接描画することはできません。ユーザーが指を動かすたびに、マスク ビットマップを変更し、画像を描画する UIView を無効にする必要があります。同じ画像をもう一度描画できる場合もあれば、描画するたびにマスクとマスクされた画像を再構築する必要がある場合もあります。マスク イメージがビットマップ ピクセル データを直接参照している限り、実際に割り当てられるメモリはほとんどありません。

したがって、疑似コードでは、次のようなものが必要です。

scratchableImage = ...
width = CGImageGetWidth( scratchableImage );
height = CGImageGetHeight( scratchableImage );
colorspace = CGColorSpaceCreateDeviceGray();
pixels = CFDataCreateMutable( NULL , width * height );
bitmap = CFBitmapContextCreate( CFDataGetMutableBytePtr( pixels ) , width , height , 8 , width , colorspace , kCGImageAlphaNone );
provider = CGDataProviderCreateWithCFData( pixels );
mask = CGImageMaskCreate( width , height , 8 , 8 , width , provider , NULL , false , kCGRenderingIntentDefault );
scratched = CGImageCreateWithImageInRect( scratchableImage , mask );

この時点で、scratchedによって指示されたアルファ チャネルがありますが、ガベージ データbitmapがあります。bitmapビットマップの白pixelsは不透明で、黒のピクセルは透明です。次に、すべての白いピクセルをペイントしbitmap、ユーザーがスクラッチすると、黒いピクセルをペイントします。bitmapへの変更は描画されるたびに自動的に適用されると思いますscratchedが、そうでない場合は描画するたびに再作成するだけmaskですscratched

おそらく、ユーザー入力を追跡するためのカスタム UIView があるでしょう。カスタム ビューを UIImageView から派生させて、画像を描画させるか、次の操作を行うことができます。

-(void) drawRect:(CGRect)inDirty {
  // assume scratched is a member
  CGContextDrawImage( UIGraphicsGetCurrentContext() , [self bounds] , scratched );
}

または、作成をスキップしてscratched、代わりにオリジナルを直接使用CGContextClipToMaskして描画することもできます。scratchableImage存在せずscratchableImage、スクラッチ領域がテクスチャまたはビュー階層である場合は、この方法を使用してください。

于 2010-06-09T16:53:46.943 に答える