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もオーバライドしている。