2012-04-01 14 views
9

私はタッチを検出すると思われるUIViewのサブクラスを持っています。ビューの検出は、現在のビュー内でタッチが開始された場合にのみ行われます。タッチがビューの外側で開始し、それらがカスタムビューの内側に移動すると、touchesMovedは呼び出されません。現在のビューで開始されていない移動タッチを検出するソリューションはありますか?iOS - UIViewでタッチを検出していますか?

@implementation MycustomView 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // This only gets called if touches have started in the current View 
} 

@end 
+1

....これを試してみてください。もしあなたが誰かを達成したいと思っていることについていくつかの洞察力を与えたら、* how *であなたを助けるかもしれません。 – NJones

+0

私は画面上に複数のカスタムビューを持っていますタッチを移動するとUIViewsを検出したい – aryaxt

答えて

20

次のソリューションを働きました。 MyCustomViewのインスタンスが複数ある。タッチは、私は次のコードは、MyCustomViewクラスではなくなったので、私は、そのスーパーにMyCustomViewからタッチ検出を移動することになったん

を触れているビューを検出したい移動する:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint touchLocation = [touch locationInView:self.contentView]; 

    for (UIView *view in self.contentView.subviews) 
    { 
     if ([view isKindOfClass:[MyCustomView class]] && 
      CGRectContainsPoint(view.frame, touchLocation)) 
     { 

     } 
    } 
} 
1

これはそれを修正する必要があります

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event allTouches] anyObject]; 
    for (UIView* subView in self.subviews) 
    { 
     if([subView pointInside:[self convertPoint:touch toView:subView] withEvent:event]) 
     { 
      //do your code here 
     } 
    } 
} 
+0

これはすでに持っているものと同じように動作します。私のタッチは5つの異なるUIViewを渡し、常にタッチが最初に表示されるビューを返します。 – aryaxt

+0

touchesMovedメソッドをコピーします。そこで何をしているのかを確認してください。 – skytz

+0

コードは正確にあなたが投稿したものです。その中に:NSLog(@ "%@"、[touch view]); – aryaxt

0

一つの方法(他にもあるかもしれませんが)サブビューのユーザーのやりとりを無効にし、その親ビューで動きを追跡させることです(タッチが現在どのビューになっているか把握するにはhitTestメソッドを使用します)。

0

これは文書化され、意図した動作である

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for(UITouch *touch in touches) 
    { 
     CGPoint touchPointFirstBtn = [touch locationInView:self.ChordView]; 
     if(CGRectContainsPoint(_btnC.frame, touchPointFirstBtn)) 
     { 
      if (!_btnC.isHighlighted) 
      { 
       if(!Boolean) 
       { 
        title = @"C"; 
        [_tlbView reloadData]; 
        NSLog(@"%@",@"touches C"); 

       } 
       [_btnC setHighlighted:YES]; 
       Boolean = YES; 

      } 
     } 
     else 
     { 
      [_btnC setHighlighted:NO]; 
      Boolean = NO; 
     } 
} 
関連する問題