以前にautolayout制約を扱ったことはありません。作業中の小さな新しいアプリがありますが、NIBのビューはデフォルトで自動レイアウトになっています。だから、私は機会を使ってwithを使い、これでAppleがどこに行くのかを理解しようと考えました。
最初の課題:
MKMapViewのサイズを変更する必要があり、それを新しい位置にアニメーション化したいと思います。私が慣れている方法でこれを行うと:
[UIView animateWithDuration:1.2f
animations:^{
CGRect theFrame = worldView.frame;
CGRect newFrame = CGRectMake(theFrame.Origin.x, theFrame.Origin.y, theFrame.size.width, theFrame.size.height - 170);
worldView.frame = newFrame;
}];
...次に、兄弟ビューが更新されると、MKMapViewは元の高さに「スナップ」します(私の場合、UISegmentedControlのタイトルは[myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]
に更新されます)。
だから、私がしたいことはthinkMKMapViewの制約を親ビューの高さに等しくすることから上部の相対に変更することですUISegmentedControlwasが対象:V:[MKMapView]-(16)-[UISegmentedControl]
私が望んでいるのは、MKMapViewの高さを短くして、マップビューの下のいくつかのコントロールが表示されるようにすることです。これを行うには、think固定のフルサイズビューから、下部がUISegmentedControlの上部に制約されるビューに制約を変更する必要があります。そして、ビューが新しいサイズに縮小するときにアニメーション化したいと思います。
これについてはどうすればいいですか?
編集-このアニメーションはnotアニメーションですビューの下部はすぐに170上がりますが:
[UIView animateWithDuration:1.2f
animations:^{
self.nibMapViewConstraint.constant = -170;
}];
nibMapViewConstraint
は、IBで下部の垂直スペース制約に接続されます。
制約の更新後:
[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];
self.view
を、含まれるビューへの参照に置き換えます。
これは私のために機能します(iOS7とiOS8 +の両方)。調整する自動レイアウト制約をクリックします(インターフェイスビルダーで、たとえば、上部の制約)。次に、これをIBOutletにします。
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;
上方向にアニメーション化します。
self.topConstraint.constant = -100;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:1.5 animations:^{
[self.viewToAnimate layoutIfNeeded];
}];
元の場所に戻るアニメーション
self.topConstraint.constant = 0;
[self.viewToAnimate setNeedsUpdateConstraints];
[UIView animateWithDuration:1.5 animations:^{
[self.viewToAnimate layoutIfNeeded];
}];
自動レイアウトでアニメーションを使用する方法を説明するApple自体から非常に優れたチュートリアルがあります。これに従ってください リンク そして、「例による自動レイアウト」という名前のビデオを見つけてください。自動レイアウトに関する興味深いものを提供し、最後の部分はアニメーションの使用方法についてです。
利用可能なこの小さなデモ を作成しました。非常に簡単な例で、自動レイアウト制約をどのように変更してアニメーション化できるかを示しています。 DemoViewController.m を見てください。
ほとんどの人は、自動レイアウトを使用してビューにアイテムをレイアウトし、レイアウト制約を変更してアニメーションを作成します。
多くのコードなしでこれを行う簡単な方法は、ストーリーボードでアニメーション化するUIViewを作成し、UIViewを終了する非表示のUIViewを作成することです。 xcodeのプレビューを使用して、両方のUIViewが目的の場所にあることを確認できます。その後、終了UIViewを非表示にし、レイアウト制約を交換します。
自分で書きたくない場合は、SBPと呼ばれるレイアウト制約を交換するためのポッドファイルがあります。
これの代わりにこれ以上の制約のIBOutlet reference
を使用する必要はありません。直接access
またはupdate
が適用済みの制約をProgrammatically
によって、または KVConstraintExtensionsMaster
ライブラリを使用するビューのInterface Builder
から適用できます。このライブラリは、Cumulative
のNSLayoutConstraint
動作も管理しています。
ContainerViewにHeight Constraintを追加するには
CGFloat height = 200;
[self.containerView applyHeightConstrain:height];
ContainerViewのHeight Constraintをアニメーションで更新するには
[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){
if (expectedConstraint) {
expectedConstraint.constant = 100;
/* for the animation */
[self.containerView updateModifyConstraintsWithAnimation:NULL];
}
}];