2008-09-26 27 views
11

Nếu tôi có UIView (hoặc UIView phân lớp) hiển thị, làm cách nào tôi có thể biết liệu hiện có được hiển thị trên màn hình hay không, ví dụ như đang ở trong một phần của chế độ xem cuộn hiện ngoài màn hình)?Làm cách nào để biết liệu UIView có hiển thị và trên màn hình không?

Để có thể cung cấp cho bạn ý tưởng tốt hơn về ý của tôi, UITableView có một vài phương pháp để xác định tập hợp các ô hiện có thể nhìn thấy. Tôi đang tìm một số mã có thể đưa ra quyết định tương tự cho bất kỳ UIView nào.

Trả lời

10

Chưa thử bất kỳ điều nào trong số này. Nhưng CGRectIntersectsRect(), -[UIView convertRect:to(from)View]-[UIScrollView contentOffset] dường như là các khối xây dựng cơ bản của bạn tại đây.

+0

nhanh thêm bình luận: 'UIScrollView' điều chỉnh giới hạn của nó khi bạn di chuyển quá 'convertRect: [đi/đến] Xem:' tự động đưa vào tài khoản trạng thái của bất kỳ cuộn các khung nhìn trong hệ thống phân cấp. Không cần tham chiếu đến 'contentOffset' - bạn chỉ có thể chuyển trực tiếp một rect thành không gian tọa độ của nhau. – Tommy

1

Gần đây tôi đã phải kiểm tra xem chế độ xem của tôi có nằm trên màn hình hay không. Điều này làm việc cho tôi:

CGRect viewFrame = self.view.frame; 
CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 

// We may have received messages while this tableview is offscreen 
if (CGRectIntersectsRect(viewFrame, appFrame)) { 
    // Do work here 
} 
+0

điều này sẽ không hoạt động trừ khi bạn chuyển đổi tọa độ ở đâu đó ... – n13

+0

Nó không hoạt động nếu màn hình nằm ngang – Luda

1

nếu bạn chủ yếu là lo lắng về việc phát hành một đối tượng mà không có trong hệ thống phân cấp xem, bạn có thể kiểm tra để xem nếu nó có một SuperView, như trong:

if (myView.superview){ 
//do something with myView because you can assume it is on the screen 
} 
else { 
//myView is not in the view hierarchy 
} 
2

Dưới đây là những gì tôi sử dụng để kiểm tra mà UIViews có thể nhìn thấy trong một UIScrollView:

for(UIView* view in scrollView.subviews) { 
    if([view isKindOfClass:[SomeView class]]) { 

     // the parent of view of scrollView (which basically matches the application frame) 
     CGRect f = self.view.frame; 
     // adjust our frame to match the scroll view's content offset 
     f.origin.y = _scrollView.contentOffset.y; 

     CGRect r = [self.view convertRect:view.frame toView:self.view]; 

     if(CGRectIntersectsRect(f, r)) { 
      // view is visible 
     } 
    } 
} 
Các vấn đề liên quan