UIImageViewをアニメーション化したいと思います。 NSLayoutConstraint
でviewDidLoad
を宣言し、次のコードを使用しました。
UIView.animate(withDuration: 1) {
myConstraint.constant = 100
self.view.layoutIfNeeded()
}
画像が動かないのはなぜですか?
viewDidLoad
を押すまでに、制約エンジンはまだ適用されておらず、ビューの開始位置はまだ確立されていません。したがって、元の制約をviewDidLoad
に自由に追加できますが、プロセスの後半までanimateWithDuration
を延期することをお勧めします(例:viewDidAppear
)。
たとえば、Interface Builder(IB)で追加した制約があるとします。あなたはそれに_@IBOutlet
_参照を追加することができます control-InterfaceBuilderの左側のパネルにあるドキュメントアウトラインの制約からアシスタントエディタにドラッグします。
その制約への参照ができたので、プログラムでその制約の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()
}
}
_
プログラムで作成された制約の場合も、プロセスは同じです。制約への参照を保存し、viewDidAppear
でconstant
を更新してから、layoutIfNeeded()
の呼び出しをアニメーション化します。
ViewDidAppearで制約を設定し、以下の修正を試してください
myConstant = 100
myConstraint.constant = myConstant
UIView.animateWithDuration(1, animations: {
self.view.layoutIfNeeded()
}, completion: {finished in })