/ / Comment référencer la vue "top-most"? - ios, uiview, hiérarchie

Comment référencer la vue «top-top»? - ios, uiview, hiérarchie

Dans iOS, par programmation, comment trouver ce que top le plus UIView est?

En d'autres termes .. quelle vue est affichée en ce moment?

Dis, j'ai une plume avec 3 vues empilées les unes sur les autres. Dans un programme, je peux supprimer la vue de dessus si je sais ce que c'est. Comment puis-je savoir quelle vue est au-dessus de la pointe?

Réponses:

10 pour la réponse № 1

Vous pouvez avoir beaucoup de vues supérieures car une vue ne doit pas prendre tout l’écran.

Si vous voulez la sous-vue la plus en haut d'une vue, vous pouvez appeler

[yourView subviews];

et prenez le dernier (ils sont dans l’ordre affiché, le plus en avant en dernier)

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

edit: c'est mieux (à partir de commentaires)

[[yourView subviews] lastObject];

Si vous connaissez votre viewController affiché, remplacez simplement yourView par yourController.view


3 pour la réponse № 2

Comme ça

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

3 pour la réponse № 3

Ou comme ça

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

Les fonctions

@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