2016-05-01 16 views
10

だから私はコンテナビュー(それは画面の端にドッキングしている)とで、それの外にスライドするようになっています景色を眺めることができます。、追加の再利用および削除NSLayoutAnchors

func slideOut() { 
    UIView.animateWithDuration(Double(0.5), animations: { 
     self.container.bottomAnchor 
       .constraintEqualToAnchor(self.child.bottomAnchor).active = false 
     self.view.layoutIfNeeded() 
    }) 
} 

func slideIn() { 
    UIView.animateWithDuration(Double(0.5), animations: { 
     self.container.bottomAnchor 
       .constraintEqualToAnchor(self.child.bottomAnchor).active = true 
     self.view.layoutIfNeeded() 
    }) 
    print("numConstraints: \(container.constraints.count)") 
} 

slideIn()アニメーションは、まさにその通りです。問題は私がアニメーションを行う方法を知らないことです。slideOut()上記のようにNSLayoutConstraintを無効にすると、何も起こりません。代わりにした場合、私は試してみてください。

self.container.bottomAnchor 
     .constraintEqualToAnchor(self.child.topAnchor).active = true 

を同時に制約を満たすことができないことについて警告があり何も視覚的に起こりません。 また、NSLayoutConstraintをアクティブにすると、制約の数が増えます(これは良いことではありません)。

だから私の質問は以下のとおりです。

  1. 私はこのケースでslideIn()アニメーションの逆をどのように行うのですか?
  2. 繰り返されるアニメーションの場合に既存の制約を再利用して、制約の数が足りないようにするにはどうすればよいですか?

答えて

11

constraintEqualToAnchorメソッドは、新しい制約を作成します。 スライドアウト機能でself.container.bottomAnchor.constraintEqualToAnchor(self.child.bottomAnchor)を呼び出すときは、slideInメソッドで追加した制約を使用していません。

目的のスライドアウトアニメーションを実現するには、以前の制約を参照する必要があります。ビュー階層がどのように設定されているかわからないので、制約に.activeプロパティを設定することの効果がスライドアウト機能にあるのかどうかはわかりません。 しかし、制約を再利用する一つの方法は、あなたのVCでのvarプロパティとしてそれを保持することになります。

lazy var bottomConstraint:NSLayoutConstraint = self.container.bottomAnchor 
     .constraintEqualToAnchor(self.child.bottomAnchor) 

func slideOut() { 
    UIView.animateWithDuration(Double(0.5), animations: { 
     self.bottomConstraint.active = false 
     self.view.layoutIfNeeded() 
    }) 
} 

func slideIn() { 
    UIView.animateWithDuration(Double(0.5), animations: { 
     self.bottomConstraint.active = true 
     self.view.layoutIfNeeded() 
    }) 
    print("numConstraints: \(container.constraints.count)") 
} 

アップルのドキュメントから:

制約のアクティブ化または非アクティブ化がaddConstraintを呼び出しますとremoveConstraint:上この制約によって管理される項目の最も近い共通の祖先であるビュー。

あなたが新しいものを作成し、trueにactiveを設定することで、それらを追加し続けるので、ですから、制約数の増加をseingしている理由です。

+0

アンカーで最新のサブビューボトム拘束を更新して、UIScrollView contentSizeを変更しようとしていました。それを無効にしたり、変更したり、再起動したりすることができました。この回答をお寄せいただきありがとうございます。なぜなら、それがなければ何をすべきかを推測することが困難だったからです。 – Skoua

関連する問題