Ответ 1
Еще не пробовал. Но CGRectIntersectsRect()
, -[UIView convertRect:to(from)View]
и -[UIScrollView contentOffset]
кажутся вашими основными строительными блоками здесь.
Если у меня есть подкласс UIView
(или UIView
), который является видимым, как я могу узнать, отображается ли он в настоящее время на экране (в отличие от, например, находящегося в разделе прокрутки, в настоящее время находится вне экрана)?
Чтобы вы могли лучше понять, что я имею в виду, UITableView
имеет несколько методов для определения набора видимых в данный момент ячеек. Я ищу некоторый код, который может сделать аналогичное определение для любого заданного UIView
.
Еще не пробовал. Но CGRectIntersectsRect()
, -[UIView convertRect:to(from)View]
и -[UIScrollView contentOffset]
кажутся вашими основными строительными блоками здесь.
Вот что я использовал, чтобы проверить, какие 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
}
}
}
Недавно мне пришлось проверять, было ли мое мнение на экране. Это сработало для меня:
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
}
Если вы в первую очередь обеспокоены выпуском объекта, который не находится в иерархии представлений, вы можете проверить, есть ли у него супервизор, например:
if (myView.superview){
//do something with myView because you can assume it is on the screen
}
else {
//myView is not in the view hierarchy
}