0

内部にいくつかの奇妙な形の png と重なっている 2 つの uiview があります。各 uiview の上に目に見えない形を描き、それらの形をタップしたかどうかを検出したいと考えています。そうしないと、オーバーラップによってタップが表示されます。以下のコードでこれが可能になると思いましたが、まったくタッチが表示されません。

-(void)drawRect:(CGRect)rect {
    quadrantOnePath = CGPathCreateMutable();
    CGPathMoveToPoint(quadrantOnePath, NULL, 30, 214);
    CGPathAddLineToPoint(quadrantOnePath, NULL, 281, 47);
    CGPathAddLineToPoint(quadrantOnePath, NULL, 493, 51);
    CGPathAddLineToPoint(quadrantOnePath, NULL, 306, 376);
    CGPathCloseSubpath(quadrantOnePath);
}

//in viewdidload

UITapGestureRecognizer *tapBlueRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewBlueFloorplans:)];
[tapBlueRecognizer setNumberOfTapsRequired:1];
[tapBlueRecognizer setDelegate:self];
[floorBlueHolderview addGestureRecognizer:tapBlueRecognizer];


// viewbluefunction
-(void)viewBlueFloorplans:(id)sender meso:(UIGestureRecognizer *)recognizer {

   CGPoint factor = [recognizer locationOfTouch:0 inView:self.view];
   bool processTouch = CGPathContainsPoint(quadrantOnePath, NULL, factor, true);

   if(processTouch) {
    NSLog(@"tap_viewBLU");
   }
}
4

1 に答える 1

1

1、CGPathContainsPoint を使用できるようにするために、実際に形状を描画する必要はありません。形状が正しいことがわかっている場合は、

quadrantOnePath = CGPathCreateMutable();
CGPathMoveToPoint(quadrantOnePath, NULL, 30, 214);
CGPathAddLineToPoint(quadrantOnePath, NULL, 281, 47);
CGPathAddLineToPoint(quadrantOnePath, NULL, 493, 51);
CGPathAddLineToPoint(quadrantOnePath, NULL, 306, 376);
CGPathCloseSubpath(quadrantOnePath);

形状が変わらない場合は「viewdidload」に。(メモリ リークを防ぐために、quadrantOnePath を解放することを忘れないでください) 形状をデバッグしたくない場合は、それを描画します。

2、@selector(viewBlueFloorplans:)電話をかけない-(void)viewBlueFloorplans:(id)sender meso:(UIGestureRecognizer *)recognizer

@selector(viewBlueFloorplans:)電話します-(void)viewBlueFloorplans:(UIGestureRecognizer *)recognizer

3、実際にデリゲート メソッドを実装しない場合は、[tapBlueRecognizer setDelegate:self];設定しないでください (一部の計算を節約するため)。

于 2012-04-19T11:49:04.737 に答える