2010-09-28 10 views
10

Un UIScrollView contiene varios objetos UIView; ¿Cómo puedo saber si un punto en la pantalla no generado por toques está dentro de una subvista específica de la vista de desplazamiento? hasta ahora intenta determinar si el punto está en la subvista siempre devuelve la primera subvista en la matriz de subvistas de la vista de desplazamiento principal, es decir, las coordenadas son relativas a la vista de desplazamiento, no a la ventana.determine si el punto en la pantalla se encuentra dentro de la subvista UIScrollView específica

Esto es lo que he intentado (editado)

-(UIView *)viewVisibleInScrollView 
{ 
    CGPoint point = CGPointMake(512, 384); 
    for (UIView *myView in theScrollView.subviews) 
    { 
     if(CGRectContainsPoint([myView frame], point)) 
     { 
      NSLog(@"In View"); 
      return myView; 
     } 
    } 
    return nil; 
} 
+0

- (UIView *) viewVisibleInScrollView { \t punto CGPoint = CGPointMake (512, 384); \t para (UIView * myView en theScrollView.subviews) { \t \t si (CGRectContainsPoint ([marco myView], punto)) { \t \t \t NSLog (@ "en"); \t \t \t return myView; \t \t} \t} \t return nil; } – Kyle

Respuesta

14

Parece que estás punto es relativo a la ventana, y desea que en relación con la vista actual. convertPoint:fromView: debería ayudar con esto.

Probablemente hay errores aquí, pero debe ser algo como esto:

-(UIView *)viewVisibleInScrollView 
{ 
    CGPoint point = CGPointMake(512, 384); 
    CGPoint relativePoint = [theScrollView convertPoint:point fromView:nil]; // Using nil converts from the window coordinates. 
    for (UIView *myView in theScrollView.subviews) 
    { 
     if(CGRectContainsPoint([myView frame], relativePoint)) 
     { 
      NSLog(@"In View"); 
      return myView; 
     } 
    } 
    return nil; 
} 
+4

-1. '-frame' está en el espacio de coordenadas del padre. Debería comparar contra '-bounds', o convertirlo al espacio de coordenadas de la vista de desplazamiento * una vez * y compararlo con' -frame'. –

+0

Buena captura. He ajustado el código apropiadamente. –

+0

Esto funcionó perfectamente. Gracias, sentí que estaba tan cerca. – Kyle

2

Aquí es lo que hago:

@implementation UIScrollView (FOO) 
- (id)foo_subviewAtPoint:(CGPoint)point 
{ 
    point.x += self.contentOffset.x; 
    for (UIView *subview in self.subviews) { 
     if (CGRectContainsPoint(subview.frame, point)) { 
      return subview; 
     } 
    } 
    return nil; 
} 
@end 

Y aquí es cómo lo uso:

CGPoint center = [scrollView convertPoint:scrollView.center fromView:scrollView.superview]; 
UIView *view = [scrollView foo_subviewAtPoint:center]; 

Algunas cosas a tener en cuenta:

  • El punto pasado a foo_subviewAtPoint: es expresado en el sistema de coordenadas de la vista de desplazamiento. Esta es la razón por la cual en el código de arriba tengo que convertir center a ese sistema de coordenadas desde el de su superview.
  • Estoy usando iOS 6.1+ con restricciones de diseño. Nunca he probado este código con nada más, así que YMMV.
Cuestiones relacionadas