web-dev-qa-db-fra.com

Objectif C: Comment créer self.view dans la zone de sécurité par programmation

Je viens de changer mon application de la prise en charge d'iOS 8 et versions ultérieures à la prise en charge d'iOS 9 et versions ultérieures.

Comme je n'utilise pas de storyboards pour créer mes vues, je me demandais s'il y avait l'option "Utiliser les guides de zone sûre" par programme ou quelque chose comme ça.

J'ai essayé d'ancrer ma vue, mais ils se chevauchent toujours en haut et en bas dans le simulateur iPhone X.

13
Ravindhiran

Essayez ceci dans Objective-C et voyez:

UIView * myView = // initialize view using IBOutlet or programtically

myView.backgroundColor = [UIColor redColor];
myView.translatesAutoresizingMaskIntoConstraints = NO;

if (@available(iOS 11, *)) {
    UILayoutGuide * guide = self.view.safeAreaLayoutGuide;
    [myView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
    [myView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
    [myView.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
    [myView.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;
} else {
    UILayoutGuide *margins = self.view.layoutMarginsGuide;
    [myView.leadingAnchor constraintEqualToAnchor:margins.leadingAnchor].active = YES;
    [myView.trailingAnchor constraintEqualToAnchor:margins.trailingAnchor].active = YES;
    [myView.topAnchor constraintEqualToAnchor:self.topLayoutGuide.bottomAnchor].active = YES;
    [myView.bottomAnchor constraintEqualToAnchor:self.bottomLayoutGuide.topAnchor].active = YES;

}

// Refresh myView and/or main view
[self.view layoutIfNeeded];
//[self.myView layoutIfNeeded];

Réf de: tiliser la mise en page de la zone de sécurité par programme - Swift

Résultat:

enter image description here

26
Krunal

Vous pouvez trouver top et bottom padding par programmation. Je pense que cela résoudra votre problème.

if (@available(iOS 11.0, *)) {
        UIWindow *window = UIApplication.sharedApplication.keyWindow;
        CGFloat topPadding = window.safeAreaInsets.top;
        CGFloat bottomPadding = window.safeAreaInsets.bottom;
}

Edit: Comme mentionné dans les commentaires (merci, @ albert-renshaw), l'objet ne peut pas être tiré de viewDidLoad lors de la première exécution car UIWindow ne sera pas accessible qu'après au moins une boucle d'exécution. Pour contourner cela, vous pouvez le faire de plusieurs manières:

1. Déplacez simplement votre code viewDidLoad dans une nouvelle méthode postViewDidLoad et utilisez:

[self performSelector:@selector(postViewDidLoad) withObject:nil afterDelay:0.0f];

... dans la méthode originale viewDidLoad, alors UIWindow sera accessible.

OR

2. Joignez la création de votre objet dans

dispatch_async(dispatch_get_main_queue(), ^{
// your code here...
});
13
user6788419