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;
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:
.
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.
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;
}
pour déplacer une sous-vue à l'arrière de toutes les autres sous-vues actuelles, utilisez view.sendSubviewToBack(yourSubview)
.