51 votes

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

Actuellement, j'ai un UIView qui contient quelques 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 de lui. Existe-t-il une méthode moins coûteuse pour faire en sorte qu'il persiste comme étant toujours au dessus.

Actuellement, j'ai ce qui suit à la fin de ma boucle de jeu :

[self.view bringSubviewToFront:myControlView];

Est-ce que je pourrais faire quelque chose comme ça quand le jeu commence :

myControlView.alwaysOnTop = true;

187voto

Muhammad Hassan Points 755

Objectif-C

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

Swift 2

myAlwaysOnTopView.layer.zPosition = .max

Swift 3

myAlwaysOnTopView.layer.zPosition = .greatestFiniteMagnitude

Swift 5.3

view.layer.zPosition = CGFloat(Float.greatestFiniteMagnitude)

Cette solution est meilleure, surtout si vous voulez que votre vue soit toujours en haut, indépendamment des autres vues ajoutées après elle. Il suffit d'ajouter n'importe quelle autre vue en utilisant addSubview: et il restera toujours au sommet.

IMPORTANT : cette solution fera en sorte que l'UIView apparaître sur le dessus, mais il sera toujours en dessous des autres vues du système d'interface utilisateur. En d'autres termes, toute interaction de l'utilisateur avec la vue ne fonctionnera généralement pas, car elle sera d'abord traitée par d'autres vues superposées.

26voto

Seamus Campbell Points 11752

Plutôt que d'utiliser -addSubview: pour insérer vos images, utilisez -insertSubview:belowSubview: et passer 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: y -insertSubview:atIndex: .

3voto

onmyway133 Points 2196

L'autre option est de placer votre vue sur une autre UIWindow avec un windowLevel plus élevé. Apprenez de Flipboard FLEX ou mon simplifié Paramount

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

Manager.show()

Jetez un coup d'œil à la FLEXWindow sur la façon de choisir le windowLevel approprié et de gérer le toucher

- (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;
}

1voto

PeiweiChen Points 413

Pour faire en sorte qu'une vue secondaire soit déplacée à l'arrière de toutes les autres vues secondaires en cours, utilisez la fonction view.sendSubviewToBack(yourSubview) .

1voto

fishinear Points 2452

Une autre solution serait de créer une vue conteneur invisible pour toutes vos autres vues. Ajoutez d'abord cette vue conteneur à votre vue principale, puis à la UIView que vous souhaitez placer au-dessus. Ensuite, ajoutez toutes vos autres vues à la vue conteneur, plutôt qu'à la vue principale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X