2017-08-10 84 views
0

3つのUIViewが重ねて表示されるViewControllerがあります。積み重ねると、あるビューの一番下に、次のビューが始まります。私は、各ビューの間に定数= 0を設定しました。アプリケーションが開始されるとき、viewDidLoadに、2つのトップビューの間に垂直制約に500を追加するので、下の2つのビューは以下のようにプッシュダウンされます。アニメーション中にUIViewが正しく動かない

billViewBottomConstraint.constant = 500 

私は、右の上面図の下に終わるまで後退下の2つのビューをアニメーション化するには、次の関数を呼び出します。

func animate() 
{ 

    self.billViewBottomConstraint.constant = 0 

    UIView.animate(withDuration: 2.0) { 
     self.view.layoutIfNeeded() 
    } 

} 

ビューは確かに私が望むよう正しい位置にアニメーションではなく、 。ビューがアニメーション化される前のように見え、アニメーションが呼び出されたときに外側に拡張され、アニメーションが正しい位置に向かって内側に収縮します。

答えて

0

viewDidLoadの中に、レイアウトはアニメーション化する準備ができていません。制約を適切にアニメートするには、少なくともviewDidLayoutSubviewsまで待つ必要があります。ブール値で最初に実行されることを確認してください。

fileprivate var firstLayoutSubviewsTime = true 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    if firstLayoutSubviewsTime { 
     firstLayoutSubviewsTime = false 

     animate() 
    } 
} 

あなたはすべてのビューが正しくロードされていることを確認するためにアニメーションブロック前view.layoutIfNeeded()を呼び出す必要があります。

内の内の定数を変更する必要があります。

func animate() { 
    self.view.layoutIfNeeded() 

    UIView.animate(withDuration: 2.0) { 
     self.billViewBottomConstraint.constant = 0 
     self.view.layoutIfNeeded() 
    } 
} 
+0

解決策は試しましたが、アニメーションは発生しませんでした。すべてのビューが最終的な場所にすぐに表示されます。アニメーションブロックを呼び出さずに 'billViewBottomConstraint.constant = 500'とそれに続いて' self.view.layoutIfNeeded() 'を実行すると、ビューは正しい位置に表示され、500だけシフトします。アニメーションブロック内で何が起こっているのかはわかりませんこの。 – Brosef

+0

更新された回答を確認してください。 – the4kman

関連する問題