(Ne marquez pas cette question comme étant en double. J'ai lu beaucoup de questions mais je ne trouve pas de réponse à mon problème.)
Mon problème est le suivant: J'ai un UIScrollView
qui est supposé défiler uniquement horizontalement. Ici, il défile verticalement pendant 20 pixels (fait étrange: il semble que la barre d'état ait la même hauteur).
J'ai essayé d'imprimer la taille du contenu, l'offset y et la hauteur de UIScrollView
comme ceci:
print(horizontalScrollView.contentSize)
print(horizontalScrollView.bounds.size.height)
print(horizontalScrollView.contentOffset.y)
J'ai compris:
(1125.0, 667.0). // scrollview content size
667.0. // scrollview height
-20.0 // content offset (y)
Je sais que la hauteur du contenu scrollView
doit être <= scrollView
height. Et comme vous pouvez le voir, c’est le cas.
J'utilise des contraintes pour placer 3 UIViewController
empilés horizontalement. Et cela fonctionne bien sauf pour ce problème.
Un autre fait: cela fonctionnait avant Swift 4 et Xcode 9 ... Je ne sais pas si cela pourrait en être la cause ou non.
Avez-vous des idées? Merci d'avance pour votre aide.
dans Swift 4 et Xcode 9, les insertions de contenu peuvent être ajustées automatiquement. Essayez de définir le comportement de votre vue de défilement pour ne pas l'ajuster.
if #available(iOS 11, *) {
scrollview.contentInsetAdjustmentBehavior = .never
}
Vous pouvez simplement faire ceci. Swift 4
self.scrollView.contentSize.height = 1.0 // disable vertical scroll
solution très charmante est:
// also don't forget
// YourViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
self.scrollView.delegate = self
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.contentOffset.y > 0 || scrollView.contentOffset.y < 0 {
scrollView.contentOffset.y = 0
}
}
Swift 3 & 4: Désactivez le défilement UIScrollView et conservez le décalage de contenu actuel:
scrollView.isScrollEnabled = false
ou
scrollView.panGestureRecognizer.isEnabled = false
Activer le défilement à nouveau:
scrollView.isScrollEnabled = true
ou
scrollView.panGestureRecognizer.isEnabled = true
il suffit de définir le contentOffset dans scrollViewDidScroll
if scrollView.contentOffset.y > 0 {
scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0)
}