2012-04-14 19 views
8

He creado un gráfico spider al sobrepasar draw rect, estoy usando core grahics CAShapeLayer para dibujar mis áreas, hay múltiples regiones CAShapeLayer que se crean en la pantalla, quiero detectar qué capa se toca cuando el los usuarios tocan ... pero no puedo entender cómo?detectar CAShapeLayer touch

Respuesta

16

Primero, no debería dibujar capas en drawRect, pero esa no es su pregunta. Para identificar una capa que está "tocado", se puede hacer algo como esto ...

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    for (UITouch *touch in touches) { 
     CGPoint touchLocation = [touch locationInView:self.view]; 
     for (id sublayer in self.view.layer.sublayers) { 
      BOOL touchInLayer = NO; 
      if ([sublayer isKindOfClass:[CAShapeLayer class]]) { 
       CAShapeLayer *shapeLayer = sublayer; 
       if (CGPathContainsPoint(shapeLayer.path, 0, touchLocation, YES)) { 
        // This touch is in this shape layer 
        touchInLayer = YES; 
       } 
      } else { 
       CALayer *layer = sublayer; 
       if (CGRectContainsPoint(layer.frame, touchLocation)) { 
        // Touch is in this rectangular layer 
        touchInLayer = YES; 
       } 
      } 
     } 
    } 
} 
+0

Hola Jody, ¿puedes ampliar el código dentro de la condición if para más luz, – user1333444

+0

OK, he actualizado con un poco mas detalle. Básicamente, si se trata de una capa de forma, consulta su ruta y ve si esa ruta contiene el punto ... Tenga en cuenta, sin embargo, que debe pasar el tipo de relleno como parte de CGPathContainsPoint - Supuse que es par/impar. Use lo que necesite ... –

+0

Esto no funciona para los toques en el borde si el ancho de la línea es mayor que 1. – jjxtra