web-dev-qa-db-fra.com

Désactiver le défilement vertical dans UIScrollView Swift

(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. 

3
Paul Bénéteau

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
}
5
Au Ris

Vous pouvez simplement faire ceci. Swift 4

self.scrollView.contentSize.height = 1.0 // disable vertical scroll
7
kubacizek

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
     }
  }
4
Mr.Zyb

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
1
Fox5150

il suffit de définir le contentOffset dans scrollViewDidScroll

if scrollView.contentOffset.y > 0 {
    scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0)
}
1
Kashif Mujeeb