2011-11-04 19 views
5

En iOS, programáticamente, ¿cómo se puede encontrar lo que más altoUIView es?¿Cómo hacer referencia a la vista "máxima"?

En otras palabras, ¿qué vista se muestra en este momento?

Digamos que tengo una punta con 3 vistas apiladas una encima de la otra. Dentro de un programa, puedo eliminar la vista superior si sé de qué se trata. ¿Cómo puedo saber qué vista hay encima de la punta?

Respuesta

9

Puede tener muchas de las mejores vistas porque una vista no tiene que ocupar toda la pantalla.

Si desea más subvista parte superior de una vista, puede llamar

[yourView subviews]; 

y tomar tje último (que están en orden que se muestra, la mayor parte frontal última)

[[yourView subviews] objectAtIndex:[[yourView subviews] count]]; 

de edición: esto es mejor (de comentarios)

[[yourView subviews] lastObject]; 

Si sabe que su viewController se muestra basta con sustituir YourView por usted rController.view

+0

No se olvide de probar la isHidden. Y .alpha! = 0. Y que la vista está en pantalla. –

+0

en su ejemplo, ¿cómo sé qué es 'yourView'? – JAM

+0

Como dije en mi última oración, yourView puede ser su MainViewController.view si suMainViewController es el controlador que maneja las vistas visualizadas (por ejemplo, su rootViewController si no agregó ningún modalViewController o no presionó ningún controlador en un controlador de navegación) . De manera más general, es la primera vista que tienes que sabes que se muestra actualmente. Si desea una respuesta más precisa, deberá explicar qué es su aplicación y qué muestra, y podría decirle qué vista debe usar. – MatLecu

2

gusta esta

UIView *topMost = [[self.view subviews] lastObject]; 
3

O como esta

UIWindow *window = [[UIApplication sharedApplication].keyWindow; 
UIView *topMost = [window findTopMostViewForPoint:CGPointMake(100, 100)]; 

Funciones

@implementation UIView (Extra) 

- (UIView *)findTopMostViewForPoint:(CGPoint)point 
{ 
    for(int i = self.subviews.count - 1; i >= 0; i--) 
    { 
     UIView *subview = [self.subviews objectAtIndex:i]; 
     if(!subview.hidden && CGRectContainsPoint(subview.frame, point)) 
     { 
      CGPoint pointConverted = [self convertPoint:point toView:subview]; 
      return [subview findTopMostViewForPoint:pointConverted]; 
     } 
    } 

    return self; 
} 

- (BOOL)isTopmostViewInWindow 
{ 
    if(self.window == nil) 
    { 
     return NO; 
    } 

    CGPoint centerPointInSelf = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)); 
    CGPoint centerPointOfSelfInWindow = [self convertPoint:centerPointInSelf toView:self.window]; 
    UIView *view = [self.window findTopMostViewForPoint:centerPointOfSelfInWindow]; 
    BOOL isTopMost = view == self || [view isDescendantOfView:self]; 
    return isTopMost; 
} 

@end 
Cuestiones relacionadas