Как узнать, является ли UIView видимым и на экране?

Если у меня есть подкласс UIView (или UIView), который является видимым, как я могу узнать, отображается ли он в настоящее время на экране (в отличие от, например, находящегося в разделе прокрутки, в настоящее время находится вне экрана)?

Чтобы вы могли лучше понять, что я имею в виду, UITableView имеет несколько методов для определения набора видимых в данный момент ячеек. Я ищу некоторый код, который может сделать аналогичное определение для любого заданного UIView.

Ответ 1

Еще не пробовал. Но CGRectIntersectsRect(), -[UIView convertRect:to(from)View] и -[UIScrollView contentOffset] кажутся вашими основными строительными блоками здесь.

Ответ 2

Вот что я использовал, чтобы проверить, какие UIView были видимы в 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 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
        }
    }
}

Ответ 3

Недавно мне пришлось проверять, было ли мое мнение на экране. Это сработало для меня:

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
}

Ответ 4

Если вы в первую очередь обеспокоены выпуском объекта, который не находится в иерархии представлений, вы можете проверить, есть ли у него супервизор, например:

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