web-dev-qa-db-fra.com

Déplacement en douceur du contenu offset UIScrollView Swift

Je voudrais définir le contentOffset de mon scrollview par programme lorsque le contentOffset se situe entre deux points (voir l'image ci-dessous) avec Swift. 

Le problème est que je voudrais ajouter une transition en douceur pour le déménagement, mais je n'ai pas trouvé de documentation pour cela. J'ai essayé de faire une boucle afin de diminuer progressivement le contenu du décalage, mais le résultat n'est pas très bon. 

Dans cet exemple, si le décalage du contenu est inférieur à 150 px à la fin du défilement, il se déroule sans à-coups (la durée de l'animation serait de 1 seconde) jusqu'au point dont le décalage est égal à 100. Jusqu'à 150 px, le résultat est à 200px. 

Si vous pouvez me donner des instructions (documentation ou exemple rapide) sur ce qu'il faut faire, ce serait génial :) Merci!

 enter image description here

16
Jibeee

Vous pouvez utiliser UIView.animations

  func goToPoint() {
    dispatch_async(dispatch_get_main_queue()) {
      UIView.animateWithDuration(2, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: {
        self.scrollView.contentOffset.x = 200
        }, completion: nil)
    }
  }
24
fatihyildizhan

Voici la version Swift 3 du code de fatihyildizhan.

       DispatchQueue.main.async {
        UIView.animate(withDuration: 0.2, delay: 0, options: UIViewAnimationOptions.curveEaseOut, animations: {
            self.myScrollView.contentOffset.x = CGFloat(startingPointForView)
            }, completion: nil)
    }
11
user3739902

Maintenant, vous pouvez simplement appeler la méthode setContentOffset(_ contentOffset: CGPoint, animated: Bool) au lieu des solutions précédentes en appelant un bloc d'animation en désordre. Voir:

x = CGFloat(startingPointForView)
myScrollView.setContentOffset(CGPoint(x: x, y: 0), animated: true)

J'espère que ça aide.

2
thorng

Swift 4:

DispatchQueue.main.async {
    UIView.animate(withDuration: 1, delay: 0, options: UIView.AnimationOptions.curveLinear, animations: {
            self.scrollView.contentOffset.x = 200
    }, completion: nil)
}
0
Charlie Seligman