2010-09-28 8 views
10

UIScrollView zawiera kilka obiektów UIView; jak rozpoznać, czy punkt na ekranie, który nie został wygenerowany przez dotknięcia, znajduje się w określonym przedziale widoku przewijania? Dotychczasowe próby określenia, czy punkt znajduje się w podprzestrzeni, zawsze zwracają pierwszy widok podrzędny w tablicy podekresów nadrzędnego przewijania, tj. współrzędne odnoszą się do widoku przewijania, a nie do okna.określić, czy punkt na ekranie znajduje się w określonym podglądzie UIScrollView

Oto, co starałem (edytowane)

-(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 punkt CGPoint = CGPointMake (512, 384); \t dla (UIView * myView w theScrollView.subviews) { \t \t if (CGRectContainsPoint ([myView ramki] Punkt)) { \t \t \t NSLog (@ "W widoku"); \t \t \t return myView; \t \t} \t} \t powrót zero; } – Kyle

Odpowiedz

14

Wygląda na to, że jesteś punkt jest w stosunku do okna, a chcesz go w stosunku do bieżącego widoku. convertPoint:fromView: powinien w tym pomóc.

Istnieje prawdopodobnie błędy tutaj, ale powinno to wyglądać mniej więcej tak:

-(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' znajduje się w przestrzeni współrzędnych rodzica. Powinieneś porównać z '-bounds' lub przekonwertować go do przestrzeni współrzędnych widoku przewijania * raz * i porównać z' -frame'. –

+0

Przyjemny połów. Poprawiłem kod poprawnie. –

+0

To działało idealnie. Dzięki, czułem się, jakbym był tak blisko. – Kyle

2

Oto, co zrobić:

@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 

A oto jak go używać:

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

Kilka rzeczy do zapamiętania:

  • Punkt przekazany do foo_subviewAtPoint: to wyrażony w układzie współrzędnych widoku przewijania. Dlatego w powyższym kodzie muszę przekonwertować center na ten układ współrzędnych z tego z jego superview.
  • Używam iOS 6.1+ z ograniczeniami układu. Nigdy nie testowałem tego kodu z niczym innym, więc YMMV.
Powiązane problemy