2012-04-01 15 views
9

Quindi ho una sottoclasse di UIView che supponiamo di rilevare i tocchi. La vista rileva tocca solo se i tocchi sono iniziati all'interno della vista corrente. Quando i tocchi iniziano al di fuori della vista e si spostano all'interno della mia vista personalizzata, touchMoved non viene chiamato. Qualche soluzione per rilevare i tocchi in movimento che non sono stati avviati nella visualizzazione corrente?iOS - Rilevare tocchi in un UIView?

@implementation MycustomView 

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

@end 
+1

Questo è il comportamento documentato e destinati. Forse se dai qualche idea su * cosa * vuoi realizzare qualcuno potresti aiutarti con il * come *. – NJones

+0

Ho più viste personalizzate sullo schermo Voglio rilevare le UIViews mentre i tocchi si spostano su di loro – aryaxt

risposta

20

La seguente soluzione ha funzionato. Ho più istanze di MyCustomView; come i tocchi muovono voglio rilevare i punti di vista che vengono toccati

ho finito per spostare il rilevamento touch da MyCustomView alla sua Superview, in modo che il codice riportato di seguito non è più in classe 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

questo dovrebbe risolvere il problema:

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

Si comporta allo stesso modo di quello che ho già. I miei tocchi passano 5 diverse UIViews e restituisce sempre la prima vista che i tocchi iniziarono da – aryaxt

+0

copia il metodo touchesMoved .. per vedere cosa stai facendo lì .. – skytz

+0

Il codice è esattamente quello che hai postato, eccetto che ho un NSlog in esso: NSLog (@ "% @", [touch view]); – aryaxt

0

Un modo farlo (anche se potrebbero essercene altri) è disabilitare l'interazione dell'utente per le visualizzazioni secondarie e fare in modo che la loro vista genitore segua il movimento (usare il metodo hitTest per capire quale vista è attualmente sfiorata).

0

Prova questo ....

-(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; 
     } 
} 
Problemi correlati