2010-09-09 9 views
9

En una subclase de UIView tengo esto:iPhone - determinar si se produjo en contacto subvista de un UIView

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
    { 
     if(touch occurred in a subview){ 
     return YES; 
     } 

     return NO; 
    } 

Qué puedo poner en la sentencia if? Quiero detectar si se produjo un toque en una subvista, independientemente de si se encuentra o no dentro del marco de la UIView.

Respuesta

2
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return ([self hitTest:point withEvent:nil] == yourSubclass) 
} 

El método - (UIView *) hitTest: (CGPoint) el punto withEvent: (UIEvent *) evento devuelve el descendiente más alejado del receptor en la jerarquía de vistas (incluida la propia) que contiene un punto especificado. Lo que hice allí es devolver el resultado de la comparación de la vista más lejana con su subvista. Si su subvista también tiene subvistas, puede que esto no funcione para usted. Así que lo que se quiere hacer en ese caso es:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return ([[self hitTest:point withEvent:nil] isDescendantOfView:yourSubclass]) 
} 
+0

pero este método es una subclase de UIView, por lo que este se bloquea: – sol

+0

siento, supongo que tienen que añadir una respuesta para explicar - ver a continuación – sol

0

embargo, este método está en una subclase de UIView, por lo que este se bloquea:

return ([[self hitTest:point withEvent:nil] isDescendantOfView:self]) 

Es de suponer que, debido a la recursividad infinita.

yo probamos este:

NSSet* touches = [event allTouches]; 
UITouch* touch = [touches anyObject]; 

return ([touch.view isDescendantOfView:self] || touch.view == self); 

Pero siempre resulta No

+0

Esto funcionó para mí en una subclase de UIView: - (void) touchesBegan: (NSSet *) toques con evento: (UIEvent *) evento { \t \t UITouch * touch = [toca cualquier objeto]; \t if ([touch.view isDescendantOfView: mySubView]) { \t \t NSLog (@ "YUP"); \t} \t else { \t \t NSLog (@ "NOPE"); \t} } –

+0

esto no detecta toques fuera del marco de la vista, es la parte más importante que estoy buscando. – sol

12

try que:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    return CGRectContainsPoint(subview.frame, point); 
} 

Si desea volver SÍ si el contacto está dentro de la vista en la que se implementa este método, use este código: (en caso de que quiera agregar reconocedores de gestos a una subvista que se encuentra fuera de los límites del contenedor)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if ([super pointInside:point withEvent:event]) 
    { 
     return YES; 
    } 
    else 
    { 
     return CGRectContainsPoint(subview.frame, point); 
    } 
} 
1

Prueba esto:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    if([touch.view isKindOfClass:[self class]]) { 
    return YES; 
    } 
    return NO; 
} 
0

versión Swift:

var yourSubview: UIView! 

    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
    return subviewAtPoint(point) == yourSubview 
    } 

    private func subviewAtPoint(point: CGPoint) -> UIView? { 
    for subview in subviews { 
     let view = subview.hitTest(point, withEvent: nil) 
     if view != nil { 
     return view 
     } 
    } 
    return nil 
    } 
Cuestiones relacionadas