2008-09-26 15 views
11

Si j'ai une sous-classe UIView (ou UIView) visible, comment puis-je savoir si elle est actuellement affichée à l'écran (par opposition à, par exemple, être dans une section d'une vue défilante qui est actuellement hors écran)?Comment savoir si un UIView est visible et à l'écran?

Pour vous donner une meilleure idée de ce que je veux dire, UITableView a quelques méthodes pour déterminer l'ensemble des cellules actuellement visibles. Je cherche un code qui peut faire une détermination similaire pour un UIView donné.

Répondre

10

Pas encore essayé. Mais CGRectIntersectsRect(), -[UIView convertRect:to(from)View] et -[UIScrollView contentOffset] semblent être vos blocs de construction de base ici.

+0

commentaire supplémentaire rapide: 'UIScrollView' ajuste ses limites lorsque vous faites défiler de façon' convertRect: [à/de] Voir: 'prend automatiquement en compte la état de tout faire défiler les vues dans la hiérarchie. Pas besoin de référencer 'contentOffset' - vous pouvez simplement convertir le rectangle directement dans l'espace de coordonnées de l'autre. – Tommy

1

J'ai récemment dû vérifier si ma vue était à l'écran. Cela a fonctionné pour moi:

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 
} 
+0

cela ne fonctionnera pas sauf si vous convertissez des coordonnées quelque part ... – n13

+0

Cela ne fonctionne pas si l'écran est horizontal – Luda

1

si vous êtes surtout inquiet pour libérer un objet qui ne sont pas dans la hiérarchie de vue, vous pouvez tester pour voir si elle a un superview, comme dans:

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

Voici ce que je vérifier que UIViews étaient visibles dans un 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 
     } 
    } 
} 
Questions connexes