これに困惑した。
ビューの 1 つに panGesture が追加された UIViewController サブクラスがあります。これは、UIViewController をサブクラス化する主な理由ではありません。また、他のviewControllerが継承する特定の美学も提供します。コントローラーは UIViewControllerTransitioningDelegate に準拠し、init が成功すると、それ自体に transitioningDelegate プロパティを設定します。また、modalPresentationStyle プロパティをカスタムに設定します。
これは、デリゲート メソッドで、表示と非表示用のアニメーター、および非表示用の対話コントローラーを提供します。これは単に UIPercentDrivenInteractiveTransition() のインスタンスです。
ちなみに、このビューは常に部分的に画面に表示されます。ジェスチャで閉じる場合、panGesture の yOffset が負の値でない限り、すべて正常に動作します。ジェスチャが負の Y オフセットで終了した場合、インタラクション コントローラーは予想どおりインタラクティブな遷移をキャンセルしますが、その後 panGesture によって登録されたすべてのタッチは視覚的に反映されません。
少し印刷した後、transitioningDelegate が削除されず、presentationStyle も変更されないことに気付きました。UIViewControllerTransitioningDelegate のデリゲート メソッドの呼び出しが停止します。その理由がわかりません。
これは、カスタム初期化子と NSCoder で必要な初期化子の後に呼び出されます。
private func setup() {
transitioningDelegate = self
modalPresentationStyle = .Custom
}
の中でviewDidLoad()
、次のことが起こります。
panGesture.addTarget(self, action: "handlePan:")
panGesture.delegate = self
view.addGestureRecognizer(panGesture)
鍋の扱いはこんな感じです。
switch gesture.state {
case .Began :
interactionController = UIPercentDrivenInteractiveTransition()
dismissViewControllerAnimated(true, completion: nil)
case .Changed:
interactionController.updateInteractiveTransition(percentage)
case .Cancelled, .Failed, .Ended:
if (gesture.velocityInView(view).y < 0) {
interactionController.cancelInteractiveTransition()
if gesture.translationInView(view).y < 0 {
print("This is when things go weird.")
}
}
else {
interactionController.finishInteractiveTransition()
}
default:
let _ = 0
}
そして、UIViewControllerTransitioningDelegate()
interactionControllerDismissal のデリゲート メソッドは、次のような変数を返すだけです。
func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? {
return interactionController
}
画面に部分的にしか表示されていないため、viewController を正しく表示していませんか? これは画面に表示する正しい方法ですか?