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.

Foi útil?

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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top