読者です 読者をやめる 読者になる 読者になる

not good but great

プログラミング、アート、映画・本の感想について書きます。

UIPercentDrivenInteractiveTransitionを使ってModalをDismissする

Swift

https://raw.githubusercontent.com/naoyashiga/RPModalGestureTransition/master/demo.gif github.com

UIViewControllerAnimatedTransitioningを使ってカスタム遷移を作ったことがあったのだけど、それをスワイプなどのインタラクティブな操作で遷移できるようにしたかった。

iOS7からUIPercentDrivenInteractiveTransitionを使えばInteractiveな遷移ができる。ということでModalをGestureで閉じるやつを作った。

cancelした時のdurationを調整

override func cancelInteractiveTransition() {
    completionSpeed = percentCompleteThreshold
    super.cancelInteractiveTransition()
}

override func finishInteractiveTransition() {
    completionSpeed = 1.0 - percentCompleteThreshold
    super.finishInteractiveTransition()
}

Interactiveな遷移を途中で止めた時、ここではgesture操作を止めて指を離した時に、cancelInteractiveTransitionが呼ばれる。元に戻るアニメーションの時間は自分で定義したアニメーション時間を考慮して定義される。

例えば、10sのアニメーションで、50%指で動かして、離したら、5sかけて戻る。これは便利なのだけど、元に戻る閾値(percentCompleteThresholdと定義した)が小さい時には困った。10%なんかにしてると、元に戻る時間が短すぎて、瞬間移動してるように見える。なので時間を確保したい。

あまり仕組みをわかっていないのだけど、

completionSpeed = percentCompleteThreshold

と書いたら、durationの90%の時間で戻るようになった。たぶんw

completionSpeedの値の更新のために、finishInteractiveTransitionもオーバライドしている。