0

マスクを使用して画像の不要な部分を削除しています。これはすべて、以下のコードを使用して正しく機能します。

次に、タップ ジェスチャ イベントを画像に添付します。ただし、UIimage フレームのフルサイズではなく、マスクされた画像の結果に適用されるタップ イベント ジェスチャが必要です。これを行う方法に関する提案はありますか?

CALayer *mask = [CALayer layer];
mask.contents = (id)[[UIImage imageNamed:self.graphicMask] CGImage];
mask.frame = CGRectMake(0, 0, 1024, 768);

[self.customerImage  setImage:[UIImage imageNamed:self.graphicOff]];
[[self.customerImage  layer] setMask:mask];
self.customerImage.layer.masksToBounds = YES;

//add event listener
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(customerSelected)];
[self.customerImage addGestureRecognizer:tap];

更新 - 私の解決策

結局、マスクを使用せず、代わりにタッチポイントのピクセルカラーをチェックすることにしました(正解で示唆されているように)。別の質問https://stackoverflow.com/a/3763313/196361のコードを使用しました。

ビューがタッチされるたびに呼び出されるビュー コントローラーにメソッドを追加しました。

- (void)touchesBegan:(NSSet*)touches
{
//check the colour of a touched point on the customer image
CGPoint p = [(UITouch*)[touches anyObject] locationInView:self.customerImage];

UIImage *cusUIImg = self.customerImage.image;

unsigned char pixel[1] = {0};
CGContextRef context = CGBitmapContextCreate(pixel,1, 1, 8, 1, NULL, kCGImageAlphaOnly);
UIGraphicsPushContext(context);
[cusUIImg drawAtPoint:CGPointMake(-p.x, -p.y)];
UIGraphicsPopContext();
CGContextRelease(context);
CGFloat alpha = pixel[0]/255.0;


//trigger click event for this customer if not already selected
if(alpha == 1.000000)
    [self customerSelected];
}
4

1 に答える 1

2

マスクがかなり長方形の場合、最も簡単な方法はUIView、マスクされた領域に一致するフレームで透明を上に追加することです。UITapGestureRecognizer次に、非表示のビューに直接追加します。

編集

マスクに基づいてタップを正確に受け入れたい場合は、タップ位置でマスクのピクセルの色を読み取り、しきい値と照合することができます。

于 2012-11-01T13:41:10.297 に答える