2010-09-28 29 views
10

Một UIScrollView chứa một số đối tượng UIView; làm thế nào tôi có thể biết một điểm trên màn hình không được tạo ra bằng cách chạm vào trong một chế độ xem phụ cụ thể của scrollview? cho đến nay cố gắng để xác định xem các điểm trong subview luôn luôn trả về subview đầu tiên trong mảng subviews của scrollview cha mẹ, tức là các tọa độ có liên quan đến scrollview, không phải là cửa sổ.xác định xem điểm trên màn hình có nằm trong tiểu sử UIScrollView cụ thể không

Đây là những gì tôi đã cố gắng (edited)

-(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 *) chế độ xemVisibleInScrollView { \t Điểm CGPoint = CGPointMake (512, 384); \t for (UIView * MyView trong theScrollView.subviews) { \t \t if (CGRectContainsPoint ([khung MyView], điểm)) { \t \t \t NSLog (@ "Trong chế độ xem"); \t \t \t trả về myView; \t \t} \t} \t return nil; } – Kyle

Trả lời

14

Có vẻ như bạn đang điểm là tương đối so với cửa sổ, và bạn muốn nó liên quan đến giao diện hiện tại. convertPoint:fromView: sẽ giúp ích cho việc này.

Có lẽ lỗi ở đây, nhưng nó sẽ giống như thế này:

-(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' nằm trong không gian tọa độ của bố mẹ. Bạn nên so sánh với '-bounds' hoặc chuyển đổi nó thành không gian tọa độ của chế độ xem * một lần * và so sánh với' -frame'. –

+0

Đẹp bắt. Tôi đã điều chỉnh mã một cách thích hợp. –

+0

Điều này làm việc hoàn hảo. Cảm ơn, cảm thấy như tôi đã rất gần. – Kyle

2

Dưới đây là những gì tôi làm:

@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 

Và dưới đây là cách tôi sử dụng nó:

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

Một số điều cần lưu ý:

  • Điểm được chuyển đến foo_subviewAtPoint:được thể hiện trong hệ tọa độ của chế độ xem cuộn. Đây là lý do tại sao trong đoạn mã trên tôi phải chuyển đổi center đến hệ tọa độ đó từ hệ thống giám sát của nó.
  • Tôi đang sử dụng iOS 6.1 trở lên với các ràng buộc về bố cục. Tôi chưa bao giờ thử nghiệm mã này với bất kỳ thứ gì khác, vì vậy YMMV.
Các vấn đề liên quan