0

ユーザーが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を使用して問題を解決する方法はわかりません。

答えて

0

私はビューコントローラの格納を使用して別の解決策を見つけました。基本的には、子ビューコントローラとそのビューをサブビューとしてプレゼンテーションビューコントローラに追加します。さらに、子ビューコントローラのビューの下にサブビューとしてpullProgressViewを追加します。

このようにして、移行する代理人に頼る必要はありませんが、すべてをアニメーション化した後、自分で子ビューコントローラーの終了を処理することができます。

関連する問題