web-dev-qa-db-fra.com

zone de sécurité iOS 11 Swift 4 pour iPhone X Prise en charge du défilement plein écran

J'ai actuellement ma configuration de disposition sous forme de vue de défilement plein écran sur un contrôleur de vue dans laquelle j'ajoute d'autres contrôleurs de vue en tant que sous-vues pour créer un effet paginé. Sur les écrans d'iphone normaux, cela fonctionne à merveille. Cependant, lorsque vous utilisez votre iPhone X, les choses semblent mal centrées et je peux feuilleter plusieurs fois sur une page. 

Voici mon code pour la configuration du scrollview 

self.scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.size.height * 3)
        if #available(iOS 11.0, *) {
            self.scrollView.contentInsetAdjustmentBehavior = .never
        } else {
            // Fallback on earlier versions
        }


        let V1 = self.storyboard?.instantiateViewController(withIdentifier: "S1") as! UINavigationController!
        self.addChildViewController(V1!)
        self.scrollView.addSubview(V1!.view)
        V1?.didMove(toParentViewController: self)
        V1?.view.frame = scrollView.bounds
        myViewsArray.append(V1!)

        let V2 = self.storyboard?.instantiateViewController(withIdentifier: "S2") as UIViewController!
        self.addChildViewController(V2!)
        self.scrollView.addSubview(V2!.view)
        V2?.didMove(toParentViewController: self)
        V2?.view.frame = scrollView.bounds
        myViewsArray.append(V2!)

        var V1Frame: CGRect = V1!.view.frame
        V1Frame.Origin.y = 2*self.view.frame.height
        V1?.view.frame = V1Frame

        var V2Frame: CGRect = V2!.view.frame
        V2Frame.Origin.y = (self.view.frame.height)
        V2?.view.frame = V2Frame

        V2!.view.alpha = 1

J'ai une zone de sécurité sur le story-board. 

 enter image description here

 enter image description here

 enter image description here

 enter image description here

13
user6520705

Vous pouvez le faire en utilisant safe area layout guide et obtenir plus d’informations en utilisant le lien:

https://medium.com/rosberryapps/ios-safe-area-ca10e919526f

Vous pouvez également le faire sans zone de sécurité: j'ai préparé une démo pour vous et dans cette démo, nous avons trois contrôleurs de vue ajoutés en vue de défilement et la vue de défilement est ajoutée sur un autre contrôleur de vue (ContainerViewController).

ContainerViewController:

import UIKit

class ContainerViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var scrollView: UIScrollView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let V1 = self.storyboard?.instantiateViewController(withIdentifier: "first")
        self.addChildViewController(V1!)
        self.scrollView.addSubview(V1!.view)
        V1?.didMove(toParentViewController: self)
        V1?.view.frame = scrollView.bounds

        let V2 = self.storyboard?.instantiateViewController(withIdentifier: "second")
        self.addChildViewController(V2!)
        self.scrollView.addSubview(V2!.view)
        V2?.didMove(toParentViewController: self)
        V2?.view.frame = scrollView.bounds

        let V3 = self.storyboard?.instantiateViewController(withIdentifier: "third")
        self.addChildViewController(V3!)
        self.scrollView.addSubview(V3!.view)
        V3?.didMove(toParentViewController: self)
        V3?.view.frame = scrollView.bounds

        var V1Frame: CGRect = V1!.view.frame
        V1Frame.Origin.y = 0
        V1?.view.frame = V1Frame

        var V2Frame: CGRect = V2!.view.frame
        V2Frame.Origin.y = (self.view.frame.height)
        V2?.view.frame = V2Frame

        var V3Frame: CGRect = V3!.view.frame
        V3Frame.Origin.y = (self.view.frame.height)*2
        V3?.view.frame = V3Frame
    }
    override func viewDidLayoutSubviews() {
        scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height*3)
    }
}

Remarque: Supprimez les contraintes supérieure et inférieure de la zone sécurisée et ajoutez-les de SuperView (pour la vue Défilement, InnerView (FirstVC, SecondVC, ThirdVC)) `

Vous pouvez vérifier toutes les fonctionnalités et les contraintes du projet de démonstration. URL de téléchargement: https://www.dropbox.com/s/4ovfqmrtwt2t8i8yi/StackOverflow.zip?dl=0

J'ai testé la démo dans iPhoneX et iPhone6 et iPhone8+

Les captures d'écran sont ci-dessous:

 enter image description here

 enter image description here

 enter image description here

 enter image description here

4
Jogendar Choudhary

Vous pouvez résoudre cela facilement.

1  enter image description here

2 .  enter image description here

2
Kamani Jasmin

définissez votre contrainte avec Safe AreaHere vous pouvez passer à la caisse ...

https://stackoverflow.com/a/45334411/6898523

https://developer.Apple.com/ios/human-interface-guidelines/overview/iphone-x/

Une fois que vous avez défini votre contrainte de défilement sur une zone sécurisée, sélectionnez votre scène viewController et décochez la propriété Adjust scroll view insets.

 enter image description here

Mis à jour

if #available(iOS 11.0, *) {
   fullScreenScrollView?.contentInsetAdjustmentBehavior = .always
 }
1
MAhipal Singh