2012-04-01 10 views
9

Also habe ich eine Subklasse von UIView, die Berührungen erkennen soll. Die Ansicht erkennt Berührungen nur, wenn die Berührungen in der aktuellen Ansicht begonnen wurden. Wenn die Berührungen außerhalb der Ansicht beginnen und sie sich in meiner benutzerdefinierten Ansicht bewegen, wird touchesMoved nicht aufgerufen. Gibt es eine Lösung, um Bewegungsberührungen zu erkennen, die in der aktuellen Ansicht nicht gestartet wurden?iOS - Berührungen in einer UIView erkennen?

@implementation MycustomView 

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

@end 
+1

Dies ist dokumentiert und beabsichtigte Verhalten. Vielleicht, wenn Sie einen Einblick geben in was Sie erreichen möchten, könnte jemand Ihnen mit dem * wie * helfen. – NJones

+0

Ich habe mehrere benutzerdefinierte Ansichten auf dem Bildschirm Ich möchte die UIViews erkennen, wie die Berührungen über sie bewegen – aryaxt

Antwort

20

Die folgende Lösung gearbeitet. Ich habe mehrere Instanzen von MyCustomView. wie die Berührungen bewege ich die Ansichten erfassen möchten, die

Ich landete bewegt Berührungserkennung von MyCustomView seiner superview berührt werden, so dass der folgende Code ist nicht mehr in MyCustomView Klasse:

- (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

sollte es beheben:

- (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

Es verhält sich genauso wie das, was ich bereits habe. Meine Berührungen passieren 5 verschiedene UIViews, und es gibt immer die erste Ansicht, dass die Berührungen von – aryaxt

+0

Kopieren Sie die touchesMoved-Methode .. um zu sehen, was Sie dort tun .. – skytz

+0

Der Code ist genau das, was Sie gepostet, außer ich habe ein NSlog drin: NSLog (@ "% @", [Touch-Ansicht]); – aryaxt

0

Ein Weg, Um dies zu tun (auch wenn es andere geben könnte), deaktivieren Sie die Benutzerinteraktion für die Untersichten und machen ihre Elternansicht die Bewegung nachverfolgen (verwenden Sie die hitTest Methode, um herauszufinden, welche Ansicht die Berührung gerade ist).

0

Try this ....

-(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; 
     } 
} 
Verwandte Themen