ユーザーがMKMapView
の注釈をカスタムトランジションを使用してクリックすると、表示コントローラーが表示されます。この遷移は、注釈のフレームから最終的な全画面表示に向かって提示されたビューコントローラのフレームをアニメートする。プルダウンジェスチャーを使用して、UIViewControllerトランジションが解消すると点滅します
表示されたビューコントローラを閉じると、ユーザーには2つのオプションがあります。右上の閉じるボタンをクリックすると、表示解除のトランジションによってビューのアニメーションがアノテーションのフレームに戻ります。この部分はうまく動作します。
しかし、ユーザーはビューを少なくとも200ポイントドラッグすることができます。また、彼女が指を持ち上げると、「解除された」状態から開始して同じディスマイス遷移を実行します。
私の提示したView Controllerのルートビューには、contentView
という2つのサブビューがあり、すべての実際のコンテンツを保持しており、UIPanGestureRecognizer
が定義されており、ユーザのジェスチャ。 contentView
の下にあるpullProgressView
と呼ばれ、ユーザーがドラッグするときにそのまま残ります。ユーザーが既にドラッグしていったときにさらに下にいっぱいになる円が表示され、指を離した時点でView Controllerが解除されます。次のように
ジェスチャー認識の本質的な部分が見えます:私はdismissView()
呼び出しを引き継ぐ
let progress = sender.translation(in: contentView).y
let screen = UIScreen.main.bounds
if sender.state == .began || sender.state == .changed {
if progress > 0 {
// Dragged down -> allow movement of the view
contentView.center = CGPoint(x: contentView.center.x,
y: screen.size.height/2 + progress)
}
} else if sender.state == .ended {
if contentView.frame.origin.y > threshold {
// Dragged down far enough to dismiss the view controller
print("contentView frame right before dismissing: \(contentView.frame)")
self.dismissView()
} else {
// Not dragged down far enough, animate the view back
// to its original position
UIView.animate(withDuration: 0.3) {
self.contentView.frame = screen
}
}
}
私animateTransition
方法は、次のコードが含まれています
let contentView = (transitionContext.viewController(forKey: .from) as! PresentedViewController).contentView!
print("contentView frame going into animateTransition: \(contentView.frame)")
問題はそのIようですView Controllerを下にドラッグした後にView Controllerを閉じるために指を持ち上げると、ビューは「元に戻されて元に戻された状態」に戻ります。上記のコードスニペットから二print
ステートメントは、以下の出力を生成する:
contentView frame right before dismissing: (0.0, 330.0, 375.0, 667.0)
contentView frame going into animateTransition: (0.0, 0.0, 375.0, 667.0)
だからcontentView
のフレームがanimateTransition
方法(y
パラメータに注目)に 『生存』しません。 UIPanGestureRecognizer
の進捗状況を聞いてanimateTransition
の中から手動で設定することはできますが、contentView
がドラッグされたフレームに戻される前に醜いちらつきが残っています。
これを解決する方法はありますか?またはこの問題に対するより良いアプローチですか?私はUIPercentDrivenInteractiveTransition
について読んだことがありますが、それは私の場合には当てはまりますか?ドラッグダウンジェスチャーは実際には実際の棄却アニメーションの何らかのパーセンテージを生成しません(これはフレームをマップアノテーションの1つに戻すモーフィングです)。UIPercentDrivenInteractiveTransition
を使用して問題を解決する方法はわかりません。