2017-08-03 9 views
1

UIStoryboard内のUIViewControllerに追加した2つのUIViewをアニメーション化する必要があります。私は適切な制約を付けてそれらを添付して、常に見えるようにしています。これは問題ありません。制約が適用されたときのアニメーション表示の適切な方法は何ですか?

私はhttps://github.com/satoshin21/Animaライブラリを使用して、私の必要に応じてそれらのビューをアニメーション化しています。

しかし、問題は予想される手段として機能しないということです。方向や位置にアニメーション化されていないという問題があります。私はこれが私が適用した制約のためだと信じています。

制約を適用してもこれを達成する最も良い方法は何ですか?

設定すると、myView.translatesAutoresizingMaskIntoConstraints = trueにはコンソールに多数の警告メッセージが表示されます。

P.S.私はNSLayoutConstraintsという形で制約を参照していることに気付いていますが、上記のライブラリは単に制約を参照せずに行うことはできますが、良い連鎖関数を提供しているので、これを見ていません。

+1

いくつかのコードを提供し、より詳細な説明を与えることができますか? – clemens

+1

@macmoonshine、私はアニメーションの試行錯誤のための実験コードを書いています。それはいいです。私はそのコードを書き換えることができますが、私が探している答えは正しいかどうか、そうでなければ何を正しい方法で行うべきかということです。私はコードを必要としません。私は考えが必要です。 *そして、私はいつも新しいものを学びたいと思っているように、私はいつも初心者になります*私の評判は私がすでに知っているものです。 – Hemang

答えて

0

ここで問題となるのは、NSLayoutConstraintトグルは、オン/オフを切り替えることのできる値だけでなく、このトグルやその他の可能な値への参照を使用して再生することができるという意味でプロパティのように機能することです。残念ながら私が知っていることを実際に実行する方法はありません。実際、アニマに似た小さなライブラリを作成しています.NSLayoutConstraintsの性質を尊重すれば、うまくいきます。

このAnimaライブラリのフードの下では、チェーン内に宣言されたアニメーションポイント(実際にEnum値内にある)を保存し、アニメーションの移動に合わせてアニメーションポイントを適用するだけです。どちらにかかわらず、NSLayoutConstraintsを使用する場合は、translatesAutoResizingMaskIntoConstraintsをtrueに設定し直すべきではありません。 これの第2の理由は、制約が.frameやアニメーション(アニマがその外観からうまく機能する理由など)を含むすべてのiOSフレーム操作の基礎であるということです。 私は最近、この上postを書いたが、私はアップルを参照して説明するよう:

あなたの問題はtranslatesAutoresizingMaskIntoConstraintsが が呼び出されたときに、.frameのようなメソッドがまたは( をオーバーライドに応じて/ .frame.size無視されるということですそれらを使用すると、 の前または後に変換マスクの制約が変換されます)。 Appleで説明されているように:

自動サイズ変更のマスクでは、ビューの サイズと位置を完全に指定することに注意してください。したがって、このサイズまたは位置を変更することなく、コンフリクトを引き起こすことなく、 に追加の制約を追加することはできません。 自動レイアウトを使用して、ビューのサイズと位置を動的に計算し、 にする場合は、このプロパティをfalseに設定してから、 の曖昧で矛盾しないビューの制約のセットを指定する必要があります。それ以外の場合は を更新し

、あなたは基本的に自分の制約を無視するようにコントローラに伝えることを行うことによって、これらのビューでtrueにtranslatesAutoResizingMaskIntoConstraintsを設定し、かつ.frameまたは.frameに基づいて制約を適用しようとしないようにしよう。サイズまたは位置の値はUIViewに設定されています。したがって、カスタム制約を廃止する必要があります。これを止めれば、まだ問題が発生しているかもしれませんが、おそらく制約値の問題です。残念なことに、コードなしでこれ以上のアドバイスはできません。

0

まず、ビューに適切な制約を設定している場合は、translatesAutoresizingMaskIntoConstraintstrueに設定しないでください。このプロパティをtrueに設定すると、ビューに制約が追加され、競合が発生します。

制約とアニメーションのための一般的なコードは

aConstraint.constant = 1234 
anotherConstraint.isActive = false 
thirdConstraint.isActive = true // thirdConstraint replaces anotherConstraint 
UIView.animatewithDuration: 0.25) { 
    self.view.layoutIfNeeded() 
} 

では、この情報がお役に立てば幸いです。 ;)

0

私の解決方法は、そのUIViewControllerの制約を削除し、私の必要に応じてプログラムでフレームを設定することです。これは正常に動作し、AutoLayoutの使い方でこのパッチ状のことをする必要はありません。

関連する問題