2011-11-04 10 views
5

In iOS, in modo programmatico, come si può trovare quello che è più in altoUIView è?Come fare riferimento alla vista "più in alto"?

In altre parole .. quale vista viene visualizzata in questo momento?

dire che ho un pennino con 3 visite impilati uno sopra l'altro. All'interno di un programma, posso rimuovere la vista dall'alto se so cosa sia. Come posso scoprire quale vista è in cima al pennino?

risposta

9

si può avere un sacco di top maggior parte delle viste, perché la vista non deve prendere tutto lo schermo.

Se si desidera che la parte superiore più visualizzazione secondaria di vista, è possibile chiamare

[yourView subviews]; 

e prendere tje ultimo (sono in ordine visualizzato, la maggior parte anteriore ultima)

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

edit: questo è migliore (dai commenti)

[[yourView subviews] lastObject]; 

Se sai che il tuo ViewController visualizzato sostituisce yourView per te rController.view

+0

Non dimenticate di verificare isHidden. E .alpha! = 0. E che la vista è sullo schermo. –

+0

nell'esempio, come faccio a sapere cos'è 'yourView'? – JAM

+0

Come ho detto nella mia ultima frase, yourView può essere yourMainViewController.view se yourMainViewController è il controllore gestisce questo è il punto di vista visualizzate (per esempio il vostro RootViewController se non è stato aggiunto alcun modalViewController o non hai spinto qualsiasi controller in un controller di navigazione) . Più in generale, è la prima vista che si è attualmente visualizzata. Se si desidera una risposta più precisa, è necessario spiegare quale è la vostra applicazione e cosa sta visualizzando, e potrei essere in grado di dirvi quale vista è necessario utilizzare. – MatLecu

2

Ti piace questa

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

o come questo

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

Funzioni

@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 
Problemi correlati