2017-05-07 5 views
0

これは簡単なことですが、わかりません。アニメーションが完了してから戻る必要があるfuncにUIViewアニメーションを埋め込みます。

コンテキスト:VCがビューにアニメーションを表示し、VCがアニメーションが完了するまで待機します。 LoadingViewで(UIViewのサブクラス)

loadingView.animate() 

:私はの残りの部分を含めたくない

animate() -> Bool { 
    UIView.animate(withDuration: 1.0, animations: { 
     self.imageViewCenterYConstraint.constant -= 20 
     self.layoutIfNeeded() 
    }, completion { 
     return true // This line obviously doesn't work. 
    }) 
} 

をのViewControllerで

私はこのような何かをやって考えました完了ブロック内のコード。残りのコードはVCにあります。

私はむしろアニメーションfuncに追加する追加の完了ハンドラを使ってこれを行うべきだと思っています。

PS:より良い解決策やベストプラクティスを知っている場合には、よりコンテキストがあります。ネットワークからデータを取得すると、読み込みアニメーションを表示して削除します。ネットワークデータが既にダウンロードされている場合でも、削除する前にアニメーションが完了するのを待っています。半分でアニメーションを止めたくない。

+0

のように、このメソッドを呼び出すことができます。 – Losiowaty

答えて

1

非同期タスクが完了すると関数から戻ることはできません。 (可能であれば可能ですが、VERY BAD IDEAです。非同期機能が完了するのを待ってメインスレッドをブロックする必要があります。これはUIをフリーズさせ、システムのバネボードプロセスによってアプリケーションを終了させます

完了ブロックを取得してアニメーションが完了したら呼び出す関数を記述する必要があります。問題の使用のために

animate(completion: (Bool) -> Void) { 
    UIView.animate(withDuration: 1.0, animations: { 
     self.imageViewCenterYConstraint.constant -= 20 
     self.layoutIfNeeded() 
    }, completion { 
     completion(true) 
    }) 
} 

(私はそれが正しいことだと思うが、それは調整が必要な場合がありますので、私はまだ閉鎖構文完璧を持っていません。)

1

アニメーションが完了したら、それを返すためにクロージャをエスケープ:このような何か。 同じ関数を書くと、コードは次のようになります。

func animate(completion: @escaping (Bool) -> Void) { 

    UIView.animate(withDuration: 1.0, animations: { 

     //Do your animation stuff here 
     //self.imageViewCenterYConstraint.constant -= 20 
     //self.layoutIfNeeded() 

    }, completion: {(true) in 

     completion(true) 

    }) 

} 

あなたは追加の完了ブロックまたは代理人が移動するための方法である。この

animate { (isDone) in 

    // Animation is completed do your own stuff here 


} 
関連する問題