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.
Vous pouvez le faire en utilisant safe area layout guide
et obtenir plus d’informations en utilisant le lien:
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:
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
.
Mis à jour
if #available(iOS 11.0, *) {
fullScreenScrollView?.contentInsetAdjustmentBehavior = .always
}