web-dev-qa-db-fra.com

iOS 11 Conseils de mise en page sur la zone sécurisée pour iPhone x

Mon application est déjà dans l'App Store. Hier, j'ai mis à jour ma version de Xcode à 9 et fonctionne très bien, sauf iPhone x. UI s'est effondré.

1.ici, j'ai créé deux UIView (les deux sont de hauteur fixe) nommés en-tête et barre de tabulation et j'ai caché l'ensemble de ma NavigationBar.

2.Ajout d'une extension à UIViewController pour créer Header et Tab bar

func addHeaderTab(currentViewController:UIViewController,content:String, isMenu:Bool){
        let noView = TopHeaderView()
        noView.tag = 12345
        noView.isMenu = isMenu
        noView.translatesAutoresizingMaskIntoConstraints = false
        currentViewController.view .addSubview(noView)
        if isMenu{
            noView.menuBtn .setImage(UIImage(named: "Small"), for: .normal)
            noView.logoImg.isHidden = false

        }else{
            noView.menuBtn .setImage(UIImage(named: "arrow_small"), for: .normal)
            noView.logoImg.isHidden = true
        }
        noView.titleLbl.text = content
        noView.delegate = (currentViewController as! menuOpen)

        NSLayoutConstraint(item: noView, attribute: .leading, relatedBy: .equal, toItem: currentViewController.view, attribute: .leading, multiplier: 1.0, constant: 0.0).isActive = true

        NSLayoutConstraint(item: noView, attribute: .trailing, relatedBy: .equal, toItem: currentViewController.view, attribute: .trailing, multiplier: 1.0, constant: 0.0).isActive = true

        NSLayoutConstraint(item: noView, attribute: .top, relatedBy: .equal, toItem: currentViewController.view, attribute: .top, multiplier: 1.0, constant: 0.0).isActive = true

        NSLayoutConstraint(item: noView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: 64).isActive = true

    }

et en appelant tous les Viewcontroller comme ci-dessous:

self.addHeaderTab(currentViewController: self, content:"நிகழ்ச்சி நிரல்" , isMenu: true)

Comme cette barre d'onglets, je l'ai également fait, mais tout le périphérique fonctionne normalement iPhone x.

Voir ma capture d'écran: 

 Image

j'ai étudié sur https://developer.Apple.com/ios/human-interface-guidelines/overview/iphone-x/

mais je ne suis pas clair avec leur document.

De l'aide serait appréciée, merci d'avance.

11
karthikeyan

Avec iOS11 (et l'apparition de iPhoneX), Apple a introduit le Guide de mise en page Zone sécurisée pour adapter vos vues à l'iPhoneX.

La zone de sécurité est la zone de l'écran qui n'est pas recouverte par l'encoche ou l'indicateur de domicile. 

 enter image description here

Pour éviter le problème que vous rencontrez, vous devez modifier la contrainte supérieure de votre noView pour iOS11:

if #available(iOS 11, *) {
   let guide = view.safeAreaLayoutGuide
   NSLayoutConstraint.activate([
      noView.topAnchor.constraint(equalTo: guide.topAnchor)
   ])
} else {
   NSLayoutConstraint.activate([
      noView.topAnchor.constraint(equalTo: currentViewController.topLayoutGuide.bottomAnchor)
   ])
}
NSLayoutConstraint.activate([
   noView.leadingAnchor.constraint(equalTo: currentViewController.view.leadingAnchor),
   noView.trailingAnchor.constraint(equalTo: currentViewController.view.trailingAnchor),
   noView.heightAnchor.constraint(equalToConstant: 65)
])

Malheureusement ce n'est pas tout. Parce que maintenant, votre noView descend sur iPhone X, mais la barre d'état n'a plus d'arrière-plan rouge. Vous avez ajouté une couleur de fond rouge derrière la barre d'état:

 enter image description here  enter image description here

Vous pouvez rendre les choses beaucoup plus faciles en utilisant un UINavigationController (avec une barre de navigation rouge):

 enter image description here  enter image description here

Avec cette approche, vous ne devez pas définir de contraintes! Le système effectue automatiquement tous les ajustements.

19
joern

En Objective-C pour les marges supérieure et inférieure sur iPhone-X

if (@available(iOS 11, *)) {

    NSLayoutConstraint *bottomConstraint   = [NSLayoutConstraint constraintWithItem:self.childView
                                                                          attribute:NSLayoutAttributeBottom
                                                                          relatedBy:NSLayoutRelationEqual
                                                                             toItem:self.parentView.safeAreaLayoutGuide
                                                                          attribute:NSLayoutAttributeBottom
                                                                         multiplier:1.0
                                                                           constant:0];


    NSLayoutConstraint *topConstraint   = [NSLayoutConstraint constraintWithItem:self.childView
                                                                   attribute:NSLayoutAttributeTop
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:self.parentView.safeAreaLayoutGuide
                                                                   attribute:NSLayoutAttributeTop
                                                                  multiplier:1.0
                                                                    constant:0];


} else {

    NSLayoutConstraint *bottomConstraint   = [NSLayoutConstraint constraintWithItem:self.childView
                                                                      attribute:NSLayoutAttributeBottom
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:self.parentView
                                                                      attribute:NSLayoutAttributeBottom
                                                                     multiplier:1.0
                                                                       constant:0];


    NSLayoutConstraint *topConstraint   = [NSLayoutConstraint constraintWithItem:self.childView
                                                                   attribute:NSLayoutAttributeTop
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:self.parentView
                                                                   attribute:NSLayoutAttributeTop
                                                                  multiplier:1.0
                                                                    constant:0];

}
6
Chandan

Définissez la contrainte de hauteur de headerView en fonction du périphérique.

if iPhoneX {
NSLayoutConstraint(item: noView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: 64+24).isActive = true
} else {
NSLayoutConstraint(item: noView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: 64).isActive = true
}

Et définissez toutes les contraintes de sous-vue (de headerView) au bas de superview (headerView). 

Note supplémentaire sur la raison pour laquelle nous avons ajouté 24 pixels pour iphoneX:

    // portrait orientation - status bar is shown
    additionalSafeAreaInsets.top = 24.0
0
Mehul Sojitra

Si vous ne voulez pas utiliser une UINavigationController mais que vous voulez avoir une barre de navigation, vous pouvez le faire de cette manière (en utilisant une UIImageView):

https://medium.com/@kahseng.lee123/creating-custom-navigation-bar-tab-bar-for-iphone-x-f03b1e1827d3

Vous pouvez également créer une vue et définir sa contrainte supérieure en haut de la vue supérieure et sa contrainte inférieure en haut de la barre de navigation. N'oubliez pas de le rendre rouge. :-)

0
user1094081