2010-09-28 11 views
10

A UIScrollView contiene diversi oggetti UIView; come posso sapere se un punto sullo schermo non generato da tocchi si trova all'interno di una sottoview specifica della scrollview? finora si tenta di determinare se il punto è nella sottoview restituisce sempre la prima sottoview dell'array di sottoview della scrollview genitore, cioè le coordinate sono relative alla scrollview, non alla finestra.determinare se il punto sullo schermo si trova all'interno della sottoview specifica di UIScrollView

Ecco quello che ho provato (a cura)

-(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 per (UIView * myView in theScrollView.subviews) { \t \t se (CGRectContainsPoint ([cornice myView], punto)) { \t \t \t NSLog (@ "In View"); \t \t \t return myView; \t \t} \t} \t ritorno nil; } – Kyle

risposta

14

Sembra che tu sei punto è relativo alla finestra, e lo si vuole relativo alla vista corrente. convertPoint:fromView: dovrebbe aiutare con questo.

Probabilmente ci sono errori qui, ma dovrebbe essere simile a questa:

-(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' è nello spazio delle coordinate del genitore. Dovresti comparare con '-bounds', o convertirlo nello spazio delle coordinate della vista di scorrimento * una volta * e confrontarlo con' -frame'. –

+0

Bella cattura. Ho regolato il codice in modo appropriato. –

+0

Questo ha funzionato perfettamente. Grazie, mi sono sentito così vicino. – Kyle

2

Ecco quello che faccio:

@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 

Ed ecco come lo uso:

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

Alcune cose da notare:

  • Il punto passato a foo_subviewAtPoint: è espresso nel sistema di coordinate della vista di scorrimento. Questo è il motivo per cui nel codice qui sopra devo convertire center in quel sistema di coordinate da quello della sua superview.
  • Sto usando iOS 6.1+ con vincoli di layout. Non ho mai testato questo codice con qualcos'altro, quindi YMMV.
Problemi correlati