2008-09-26 7 views
11

Si tengo una UIView (o UIView subclase) visible, ¿cómo puedo saber si se muestra actualmente en la pantalla (en lugar de, por ejemplo, estar en una sección de una vista de desplazamiento que actualmente no está en pantalla)?¿Cómo puedo saber si un UIView está visible y en la pantalla?

Para tal vez darle una mejor idea de lo que quiero decir, UITableView tiene un par de métodos para determinar el conjunto de celdas actualmente visibles. Estoy buscando algún código que pueda hacer una determinación similar para cualquier UIView dado.

Respuesta

10

No intenté nada de esto todavía. Pero CGRectIntersectsRect(), -[UIView convertRect:to(from)View] y -[UIScrollView contentOffset] parecen ser sus bloques de construcción básicos aquí.

+0

rápida comentario adicional: 'UIScrollView' ajusta sus límites mientras se desplaza de modo' convertRect: [a/desde] Ver: 'automáticamente tiene en cuenta la estado de cualquier vistas de desplazamiento en la jerarquía. No es necesario hacer referencia a 'contentOffset'; puede simplemente convertir el un recto directamente en el espacio de coordenadas del otro. – Tommy

1

Recientemente tuve que verificar si mi vista estaba en pantalla. Esto funcionó para mí:

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

esto no funcionará a menos que convierta coordenadas en alguna parte ... – n13

+0

No funciona si la pantalla está horizontal – Luda

1

si está principalmente preocupado por la liberación de un objeto que no está en la jerarquía de la vista, se podría poner a prueba para ver si tiene un supervista, como en:

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

Esto es lo que he usado para comprobar qué UIViews eran visibles en 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 
     } 
    } 
} 
Cuestiones relacionadas