質問失礼します。
ログインボタンを押下したらストーリーボードの画像の様にフェードインして
画面遷移をするアニメーションをライブラリは使用せずに実装したいと思い、
下記サイトを参考にコードを記載してみたのですが、アニメーション処理が呼び出されず、
セグエで設定してあるpresent modallyで遷移してしまいます。
これは何が原因なのでしょうか。
また、アニメーションの移動処理に関してなのですが、コード内に記載のある
containerView.convert(firstViewController.firstImageView.frame, from: firstViewController.firstImageView.superview)
や
containerView.convert(secondViewController.secondImageView.frame, from: secondViewController.view)
といった引数の記載方法で、どうやって位置が指定されているのかが理解出来ませんでした。
どなたかご教授いただけますと嬉しいです。
よろしくお願い致します。
参考サイト
https://dev.classmethod.jp/articles/ios-custom-transition-zoom/
・遷移元のビューコントローラー
Swift
1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var firstImageView: UIImageView! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 } 11 }
・遷移先のビューコントローラー
Swift
1import UIKit 2 3class TopViewController: UIViewController, UIViewControllerTransitioningDelegate { 4 5 @IBOutlet weak var secondImageView: UIImageView! 6 //アニメーションのインスタンス生成 7 let loginTransition = LoginTransition() 8 9 10 override func viewDidLoad() { 11 12 super.viewDidLoad() 13 self.transitioningDelegate = self 14 } 15 16 @IBAction func backButton(_ sender: Any) { 17 18 dismiss(animated: true, completion: nil) 19 } 20 21 22 //画面遷移してきた時のアニメーション処理 23 func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 24 25 return loginTransition 26 } 27}
・アニメーション用のクラス
Swift
1import UIKit 2 3class LoginTransition: NSObject, UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning { 4 5 //アニメーションにかかる時間を設定する 6 func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { 7 return 1 8 } 9 10 //遷移時のアニメーションを設定する 11 func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { 12 13 //遷移先・遷移元ビューの情報を引数にしてアニメーションを呼び出す 14 presentTransition(transitionContext: transitionContext) 15 } 16 17 //アニメーションの内容を設定する 18 func presentTransition(transitionContext: UIViewControllerContextTransitioning) { 19 20 /// 遷移元ビューコントローラー 21 let firstViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from) as! ViewController 22 /// 遷移先ビューコントローラー 23 let secondViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to) as! TopViewController 24 ///コンテナビュー 25 let containerView = transitionContext.containerView 26 27 //遷移後のビューコントローラーを、予め最後の位置まで移動完了させ非表示にする 28 secondViewController.view.frame = transitionContext.finalFrame(for: secondViewController) 29 secondViewController.view.alpha = 0 30 //遷移後のimageは、アニメーションが完了するまで非表示にする 31 secondViewController.secondImageView.isHidden = true 32 // 遷移元のセルのイメージビューを非表示にする 33 firstViewController.firstImageView.isHidden = true 34 35 // 遷移元のセルのイメージビューからアニメーション用のビューを作成 36 let animationView = UIImageView(image: firstViewController.firstImageView.image) 37 //アニメーションビューの開始位置を指定している??←アニメーションの位置の指定方法が分からない 38 animationView.frame = containerView.convert(firstViewController.firstImageView.frame, from: firstViewController.firstImageView.superview) 39 40 // 遷移コンテナに、遷移後のビューと、アニメーション用のビューを追加する 41 containerView.addSubview(secondViewController.view) 42 containerView.addSubview(animationView) 43 44 //アニメーションを実装する(引数に秒数・アニメーションのクロージャ・完了後のクロージャを設定する) 45 UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: { 46 // 遷移後のビューを徐々に表示する 47 secondViewController.view.alpha = 1.0 48 // アニメーション用のビューを、遷移後のイメージの位置までアニメーションする←アニメーションの位置の指定方法が分からない 49 animationView.frame = containerView.convert(secondViewController.secondImageView.frame, from: secondViewController.view) 50 }, completion: { 51 //アニメーションが終了した後のクロージャ 52 finished in 53 // 遷移後のイメージを表示する 54 secondViewController.secondImageView.isHidden = false 55 // 遷移前のビューの非表示を元に戻す 56 firstViewController.firstImageView.isHidden = true 57 // アニメーション用のビューを削除する 58 animationView.removeFromSuperview() 59 transitionContext.completeTransition(true) 60 }) 61 } 62}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/17 08:46
退会済みユーザー
2020/05/17 08:51
2020/05/17 09:09
2020/05/18 04:42