質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

4859閲覧

画面が完全に遷移したあとに処理を実行したい

tjm_

総合スコア18

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/07/27 21:51

編集2019/07/29 04:59

以下のコードでスワイプで遷移できるようなコードを実装しました.
遷移後の画面のviewDidAppearメソッド内でアニメーションをするメソッドを実行しているのですが,スワイプ途中にも関わらずアニメーションが開始してしまいます.これをスワイプが完全に完了したあとにアニメーションを開始したいのですが,どのように実装すればよいのでしょうか.ご教授のほどよろしくお願い致します.

swift

1//遷移前のclass 2 3extension UIViewController { 4 //スワイプで戻るメソッド 5 func setSwipeBack() { 6 let target = self.navigationController?.value(forKey: "_cachedInteractionController") 7 let recognizer = UIPanGestureRecognizer(target: target, action: Selector(("handleNavigationTransition:"))) 8 self.view.addGestureRecognizer(recognizer) 9 } 10} 11class SecondViewController: UIViewController{ 12override func viewDidLoad() { 13 super.viewDidLoad() 14 setSwipeBack() 15... 16}

すみません.説明不足でした.補足します.
遷移後のclassのコードと実行結果を載せました.

swift

1class ViewController: UIViewController { 2 3 @IBOutlet weak var animateLabal: UILabel! 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view. 8 } 9 10 override func viewDidAppear(_ animated: Bool) { 11 super.viewDidAppear(animated) 12 self.animateView(self.animateLabal) 13 } 14 15 func animateView(_ target: UIView){ 16 UIView.animate(withDuration: 1.0, delay: 0.0, options: .autoreverse, animations: { 17 target.frame.origin.x = 0 18 }, completion: { _ in 19 target.center.x = self.view.center.x 20 self.animateView(target) 21 }) 22 } 23}

画面中央と左端の間を往復するアニメーション
画面中央と左端の間を往復するアニメーション

ボタン押下時
ボタン押下時

スクロール途中
スクロール途中(アニメーションしている)

完全に遷移した後
完全に遷移した後

画像のように中央より左に行ったりとlayoutがおかしくなってしまうので遷移後にアニメーションを開始したいです.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/07/29 02:42

>>スワイプ途中にも関わらずアニメーションが開始してしまいます まずは、これが事実であることを証明できる材料を提示して下さい。
fuzzball

2019/07/29 04:57

>>遷移前のclassのコードと実行結果を載せました. 「遷移後」の間違いでしょうか?
tjm_

2019/07/29 04:58

申し訳ありません.遷移後でした.修正します.
fuzzball

2019/07/29 05:18 編集

遷移って戻ることでしたか。 ViewController からSecondViewControllerに遷移するときにアニメーションを止めてますか?
tjm_

2019/07/29 08:37

はい.わかりにくくて申し訳ないです. 遷移するときにアニメーションは止まるものだと思っていました.ボタンを押したときにアニメーションを止めて,viewDidAppear内で再開するようにコードを書いたら上手くいきました.ありがとうございます! ベストアンサーに選ばせていただきたいのでお手数ですが回答にて空白でいいので投稿してもらってもよろしいでしょうか?
fuzzball

2019/07/29 08:38

自己解決でどうぞ。
guest

回答1

0

自己解決

戻った先の画面にて以下のコードを実装し,遷移前にアニメーションを一時停止,再び戻ってきたときに再開できるようにすることで解決しました.

swift

1//追加したコード 2 3//最初の処理かどうか 4var isFirst = true 5 6func stopAnimation(){ 7 let pausedTime = animateLabal.layer.convertTime(CACurrentMediaTime(), from: nil) 8 animateLabal.layer.speed = 0.0 9 animateLabal.layer.timeOffset = pausedTime 10} 11 12func restartAnimation(){ 13 let pausedTime = animateLabal.layer.timeOffset 14 animateLabal.layer.speed = 1.0 15 animateLabal.layer.timeOffset = 0.0 16 animateLabal.layer.beginTime = 0.0 17 let timeSincePause: CFTimeInterval = animateLabal.layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime 18 animateLabal.layer.beginTime = timeSincePause 19} 20 21override func viewDidAppear(_ animated: Bool) { 22 super.viewDidAppear(animated) 23 24 if isFirst {// 一度だけ実行したい処理 25 isFirst = false 26 animateView(animateLabal) 27 }else{ 28 restartAnimation() 29 } 30} 31 32override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 33 stopAnimation() 34}

投稿2019/07/29 16:31

編集2019/07/29 16:34
tjm_

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問