以下を達成するために、UIView にマスキング効果を作成したいと思います。画面に封印されたボックスを表示し、ユーザーはその画像 (UIView) の背後にあるものを明らかにするために画面に触れる (スクラッチ) ことができます。結果の上にあるカバー素材を引っ掻くと思われる宝くじに似たもの..
誰かが私を正しい方向に向けることができれば最高ですが、これをどのように開始すればよいかわかりません...
ありがとう
以下を達成するために、UIView にマスキング効果を作成したいと思います。画面に封印されたボックスを表示し、ユーザーはその画像 (UIView) の背後にあるものを明らかにするために画面に触れる (スクラッチ) ことができます。結果の上にあるカバー素材を引っ掻くと思われる宝くじに似たもの..
誰かが私を正しい方向に向けることができれば最高ですが、これをどのように開始すればよいかわかりません...
ありがとう
遅れてすみません。役立つサンプルコードをいくつか作成しました: https://github.com/oyiptong/CGScratch
drawonward のアプローチが機能します。
通常、ピクセルの編集は 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
、スクラッチ領域がテクスチャまたはビュー階層である場合は、この方法を使用してください。