web-dev-qa-db-ja.com

contentoffset UIScrollViewのスムーズな移動Swift

SwiftでcontentOffsetが2ポイントの間にある場合(下の図を参照)、プログラムでscrollviewのcontentOffsetを設定したいと思います。

問題は、移動のためのスムーズな移行を追加したいのですが、これに関するドキュメントが見つかりませんでした。コンテンツオフセットを徐々に減らすためにループを実行しようとしましたが、結果はあまり良くありません。

この例では、スクロールの最後でコンテンツオフセットが150ピクセル未満の場合、オフセットが100に等しいポイントまでスムーズに移動します(アニメーションの期間は1秒になります)。最大150ピクセルで、 200ピクセルまで。

あなたが私に何をすべきかの指示(ドキュメントまたは簡単な例)を提供できるなら、それは素晴らしいことです:)ありがとう!

enter image description here

19
Jibeee

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)
    }
  }
27
fatihyildizhan

以下はSwift 3バージョンのfatihyildizhanのコードです。

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

これで、面倒なアニメーションブロックを呼び出す前の回避策の代わりに、メソッドsetContentOffset(_ contentOffset: CGPoint, animated: Bool)を単に呼び出すことができます。見る:

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

それが役に立てば幸い。

3
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