web-dev-qa-db-ja.com

SwiftでNSLayoutConstraintをアニメーション化するにはどうすればよいですか?

UIImageViewをアニメーション化したいと思います。 NSLayoutConstraintviewDidLoadを宣言し、次のコードを使用しました。

UIView.animate(withDuration: 1) {
    myConstraint.constant = 100
    self.view.layoutIfNeeded()
}

画像が動かないのはなぜですか?

16
Cesare

viewDidLoadを押すまでに、制約エンジンはまだ適用されておらず、ビューの開始位置はまだ確立されていません。したがって、元の制約をviewDidLoadに自由に追加できますが、プロセスの後半までanimateWithDurationを延期することをお勧めします(例:viewDidAppear)。


たとえば、Interface Builder(IB)で追加した制約があるとします。あなたはそれに_@IBOutlet_参照を追加することができます control-InterfaceBuilderの左側のパネルにあるドキュメントアウトラインの制約からアシスタントエディタにドラッグします。

enter image description here

その制約への参照ができたので、プログラムでその制約のconstant値を変更できます(ただし、これもviewDidAppearではなくviewDidLoadで行います。ビューが表示されたときにこれをアニメーションで表示したい):

_@IBOutlet weak var topConstraint: NSLayoutConstraint!

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    topConstraint.constant = 100
    UIView.animate(withDuration: 2) {
        self.view.layoutIfNeeded()
    }
}
_

プログラムで作成された制約の場合も、プロセスは同じです。制約への参照を保存し、viewDidAppearconstantを更新してから、layoutIfNeeded()の呼び出しをアニメーション化します。

38
Rob

ViewDidAppearで制約を設定し、以下の修正を試してください

myConstant = 100
myConstraint.constant = myConstant
UIView.animateWithDuration(1, animations: {
self.view.layoutIfNeeded()
}, completion: {finished in })
10
Rupal Patel