web-dev-qa-db-fra.com

Comment faire en sorte qu'une UIView apparaisse toujours à l'avant?

Actuellement, j'ai une UIView qui contient des contrôles. J'ai ensuite quelques images que j'ajoute par programme à la vue pour les afficher sous forme d'animations. Actuellement, à la fin de chaque intervalle de ma boucle de jeu, je dois dire au contrôleur de déplacer le contrôle UIView vers l'avant, sinon les images apparaîtront au-dessus. Existe-t-il une méthode moins coûteuse pour la faire persister comme toujours au top.

Actuellement, j'ai les éléments suivants à la fin de ma boucle de jeu:

[self.view bringSubviewToFront:myControlView];

Puis-je faire quelque chose comme ça quand le jeu démarre:

myControlView.alwaysOnTop = true;
45
woot586

Plutôt que d'utiliser -addSubview: pour insérer vos images, utilisez -insertSubview:belowSubview: et passez votre UIView comme deuxième paramètre:

[self.view insertSubview:myImage belowSubview:myControlView];

Notez qu'à des fins similaires, vous avez également accès aux méthodes -insertSubview:aboveSubview: et -insertSubview:atIndex:.

25
Seamus Campbell

Objectif-C

#import <QuartzCore/QuartzCore.h>
myAlwaysOnTopView.layer.zPosition = MAXFLOAT;

Swift 2

myAlwaysOnTopView.layer.zPosition = .max

Swift

myAlwaysOnTopView.layer.zPosition = .greatestFiniteMagnitude

Cette solution est meilleure, surtout si vous souhaitez que votre vue soit toujours en haut, indépendamment des autres vues ajoutées après. Ajoutez simplement n'importe quelle autre vue en utilisant addSubview: et il restera toujours au top.

169

L'autre option consiste à placer votre vue sur une autre UIWindow avec un niveau de fenêtre supérieur. Apprenez de Flipboard FLEX ou mon simplifié Paramount

Manager.action = {
  print("action touched")
}

Manager.show()

Jetez un œil à la FLEXWindow sur la façon de choisir le bon niveau de fenêtre et la poignée tactile

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor clearColor];
        // Some apps have windows at UIWindowLevelStatusBar + n.
        // If we make the window level too high, we block out UIAlertViews.
        // There's a balance between staying above the app's windows and staying below alerts.
        // UIWindowLevelStatusBar + 100 seems to hit that balance.
        self.windowLevel = UIWindowLevelStatusBar + 100.0;
    }
    return self;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    BOOL pointInside = NO;
    if ([self.eventDelegate shouldHandleTouchAtPoint:point]) {
        pointInside = [super pointInside:point withEvent:event];
    }
    return pointInside;
}
3
onmyway133

pour déplacer une sous-vue à l'arrière de toutes les autres sous-vues actuelles, utilisez view.sendSubviewToBack(yourSubview).

1
PeiweiChen