web-dev-qa-db-fra.com

Amener une sous-vue devant toutes les autres vues

Je travaille actuellement sur l'intégration d'un fournisseur d'annonces dans mon application. Je souhaite placer un message en fondu devant l'annonce lorsque celle-ci est affichée mais qu'elle a complètement échoué.

J'ai créé une fonction qui ajoute une sous-vue à ma vue actuelle et tente de l'amener au premier plan à l'aide de

[self.view bringSubviewToFront:mySubview]

La fonction est déclenchée à la notification du chargement de l'annonce (la notification provient du SDK du fournisseur de services). Cependant, ma sous-vue ne se termine pas devant l'annonce. J'imagine que cela est rendu délibérément difficile par le fournisseur d'annonces, mais je souhaite le faire quand même. Je discute actuellement avec le fournisseur pour savoir si cela peut ou non être autorisé. Mais pour le moment, je veux juste voir si c'est même possible.

Est-ce que je peux de toute façon forcer une de mes vues à être la vue la plus haute de telle sorte qu'elle ne soit pas obstruée par quoi que ce soit?

58
Mark S

Que se passe-t-il si la vue du fournisseur d'annonces n'est pas ajoutée à self.view mais à quelque chose comme [UIApplication sharedApplication].keyWindow?

Essayez quelque chose comme:

[[UIApplication sharedApplication].keyWindow addSubview:yourSubview]

ou

[[UIApplication sharedApplication].keyWindow bringSubviewToFront:yourSubview]
84
jere

essaye ça:

self.view.layer.zPosition = 1;
152
daniel kilinskas

Version rapide 2 de la réponse de Jere:

UIApplication.sharedApplication().keyWindow!.bringSubviewToFront(YourViewHere)

Swift 3:

UIApplication.shared.keyWindow!.bringSubview(toFront: YourViewHere)

Swift 4:

UIApplication.shared.keyWindow!.bringSubviewToFront(YourViewHere)

J'espère que ça sauve quelqu'un 10 secondes! ;)

19
Paul Lehn

J'avais besoin de ça une fois. J'ai créé une classe UIView personnalisée - AlwaysOnTopView.

@interface AlwaysOnTopView : UIView
@end

@implementation AlwaysOnTopView

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (object == self.superview && [keyPath isEqual:@"subviews.@count"]) {
        [self.superview bringSubviewToFront:self];
    }

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}

- (void)willMoveToSuperview:(UIView *)newSuperview {
    if (self.superview) {
        [self.superview removeObserver:self forKeyPath:@"subviews.@count"];
    }

    [super willMoveToSuperview:newSuperview];
}

- (void)didMoveToSuperview {
    [super didMoveToSuperview];

    if (self.superview) {
        [self.superview addObserver:self forKeyPath:@"subviews.@count" options:0 context:nil];
    }
}

@end

Demandez à votre vue d'étendre cette classe. Bien sûr, cela garantit qu'une sous-vue est avant tout une vue parentale.

18
rmaddy

Pour autant que j'ai connu zposition est un meilleur moyen. 

self.view.layer.zPosition = 1;

6
Gobi M

En c #, View.BringSubviewToFront (childView); YourView.Layer.ZPosition = 1; les deux devraient fonctionner.

1

xamarin ios: this.InsertSubview (subview_youwant_beback, 0);

0
user5266363

Dans Swift 4.2

UIApplication.shared.keyWindow!.bringSubviewToFront(yourView)

Source: https://developer.Apple.com/documentation/uikit/uiview/1622541-bringsubviewtofront#declarations

0
Vinoth Vino