マスクを使用して画像の不要な部分を削除しています。これはすべて、以下のコードを使用して正しく機能します。
次に、タップ ジェスチャ イベントを画像に添付します。ただし、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];
}