酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

SwiftでUIView.beginAnimations(_: context:)〜UIView.commitAnimations()でアニメーションした場合のアニメーション終了時のイベントを取得する

UIView.beginAnimations(_: context:)〜UIView.commitAnimations()でアニメーションした場合のアニメーション終了時のイベントを取得したいと思いました。

Objective-Cを使った場合には対応方法がよく紹介されているのですが、Swift 3.1を使った書き方が調べても出てこなかったので、Swiftで清書してみました。

fileprivate func animationFoo() {
    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDelegate(self)
    UIView.setAnimationDidStop(#selector(animationDidStop(_:finished:context:)))

    // animation

    UIView.commitAnimations()
}

func animationDidStop(_ animationID: String?, finished: Bool, context: UnsafeMutableRawPointer) {
    print(#function)
}

捕捉

アニメーション終了時を取得したいのであれば。通常はUIView.animate(withDuration:animations:completion:)を使うと思います。

UIView.animate(withDuration: 0.6, animations: { 
    //animation
}) { (finished) in
    print("finish")
}

しかし、UIScrollViewでズームインかつスクロール位置を変更したい場合、同時におこなうことができませんので下記のように書いて同時に動かすようにしていました。

UIView.beginAnimations(nil, context: nil)
scrollView.setZoomScale(zoomScale, animated: false)
scrollView.setContentOffset(CGPoint(x: x, y: y), animated: false)
UIView.commitAnimations()

この方法でズーム倍率とスクロール位置を変更するとscrollViewWillBeginZooming(_:with:)が呼ばれません。

関連記事

この他にもiOSアプリ開発で見つけたネタや悩んだ内容など紹介しています。Tipsをまとめておりますのでこちらのページをご参照ください。