Как мне определить, виден ли UIView на экране?
-
02-07-2019 - |
Вопрос
Если у меня есть UIView
(или UIView
подкласс), который виден, как я могу определить, отображается ли он в данный момент на экране (в отличие, например, от раздела прокрутки, который в данный момент находится за пределами экрана)?
Может быть, чтобы дать вам лучшее представление о том, что я имею в виду, UITableView
имеет пару методов для определения набора видимых в данный момент ячеек.Я ищу какой-нибудь код, который может сделать аналогичное определение для любого данного UIView
.
Решение
Еще не пробовал ничего из этого.Но CGRectIntersectsRect()
, -[UIView convertRect:to(from)View]
и -[UIScrollView contentOffset]
похоже, это ваши основные строительные блоки здесь.
Другие советы
Вот что я использовал, чтобы проверить, какие UIViews были видны в 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
}
}
}
Недавно мне пришлось проверить, отображается ли мой вид на экране.У меня это сработало:
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
}