Como posso saber se um UIView é visível e na tela?
-
02-07-2019 - |
Pergunta
Se eu tiver um UIView
(ou UIView
subclasse) que é visível, como posso saber se ele está sendo mostrado na tela (ao contrário de, por exemplo, estar em uma seção de uma exibição de rolagem que está atualmente off- tela)?
Para talvez lhe dar uma melhor idéia do que quero dizer, UITableView
tem um par de métodos para determinar o conjunto de células actualmente visíveis. Eu estou procurando algum código que pode fazer uma determinação semelhante para qualquer UIView
.
Solução
Não tentei nada disso ainda. Mas CGRectIntersectsRect()
, -[UIView convertRect:to(from)View]
e -[UIScrollView contentOffset]
parecem ser os blocos básicos de construção aqui.
Outras dicas
Aqui está o que eu usei para verificar qual UIViews eram visíveis em um 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
}
}
}
Recentemente, tive de verificar se o meu ponto de vista foi na tela. Isso funcionou para mim:
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
}
Se você está preocupado principalmente sobre a liberação de um objeto que não está na hierarquia de vista, você pode testar para ver se ele tem um superview, como em:
if (myView.superview){
//do something with myView because you can assume it is on the screen
}
else {
//myView is not in the view hierarchy
}