2012-04-01 10 views
9

Tengo una Subclase de UIView que se supone que detecta toques. La vista detectar toca solo si los toques comenzaron dentro de la vista actual. Cuando los toques comienzan fuera de la vista y se mueven dentro de mi vista personalizada, toquesMoved no se llama. ¿Alguna solución para detectar toques en movimiento que no han comenzado en la vista actual?iOS - Detectando toques en una UIView?

@implementation MycustomView 

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

@end 
+1

Este es el comportamiento documentado y previsto. Quizás si le das una idea de * qué * quieres lograr, alguien podría ayudarte con el * cómo *. – NJones

+0

Tengo varias vistas personalizadas en la pantalla Quiero detectar las UIViews a medida que los toques se mueven sobre ellas – aryaxt

Respuesta

20

La siguiente solución funcionó. Tengo varias instancias de MyCustomView; como los toques mueven quiero para detectar los puntos de vista que están siendo tocadas

terminé moviendo la detección táctil de MyCustomView a su Superview, por lo que el siguiente código ya no está en la clase 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

esto debe solucionarlo:

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

Se comporta de la misma manera que yo. Mis toques pasan 5 UIViews diferentes, y siempre devuelve la primera vista que los toques comenzaron desde – aryaxt

+0

copie el método touchesMoved ... para ver lo que está haciendo allí ... – skytz

+0

El código es exactamente lo que publicó, excepto que tengo un registro NSlog en él: NSLog (@ "% @", [vista táctil]); – aryaxt

0

Una forma hacerlo (aunque puede haber otros) es deshabilitar la interacción del usuario para las subvistas y hacer que su vista principal rastree el movimiento (use el método hitTest para averiguar en qué vista está actualmente el toque).

0

Prueba esto ....

-(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; 
     } 
} 
Cuestiones relacionadas