2012-11-08 17 views
113

私はautolayoutという制約を使用することはありませんでした。私は私が取り組んでいる小さな新しいアプリケーションがあり、NIBの意見は自動レイアウトにデフォルト設定されていることに気づいた。だから、私はと仕事をして、Appleがどこでこれを使っているのか理解しようとしました。iOS:新しい自動レイアウト制約(高さ)にアニメーションを適用する方法

初挑戦:

私は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])。 V:[MKMapView]-(16)-[UISegmentedControl]

だから、私はそれカバーだったことUISegmentedControlの先頭に相対的であることに、親ビューの絶頂に等しいからMKMapViewの制約を変更されてやりたいをどう思う

私が望むのは、MKMapViewの高さを短くして、マップビューの下にあるいくつかのコントロールが表示されるようにすることです。これを行うには固定フルサイズビューからUISegmentedControlの最上部に制約がある制約に制約を変更する必要があります。ビューを新しいサイズに縮小してアニメーション化したいと思います。

これについてはどうすればよいですか?

編集 - このアニメーションはないあるビューの下部には、瞬時に170を上に移動んがをアニメーション:

[UIView animateWithDuration:1.2f 
     animations:^{ 
      self.nibMapViewConstraint.constant = -170; 

    }]; 

nibMapViewConstraintは、下の垂直方向のスペースの制約にIBにまで配線されています。あなたの制約を更新した後

+1

でcontainerViewの高さの制約を更新するにはcontainerView

CGFloat height = 200; [self.containerView applyHeightConstrain:height]; 

上の高さの制約を追加するには

。 。]ブロックを使用して高さの変化をアニメートします。その制約のためのIBOutletを作成し、それをxibに組み込む必要があります。そうでなければ、コード内で作成した場合(またはすべての制約をループして調べる場合)、その参照を保持しておく必要があります。 relatedByの変更をアニメーション化する方法はわかりませんが、定数の変更のみを行い、他の値の制約は変更しないでください(他の値については、新しい制約を作成してください)。 – yuf

+0

Hmm。私はすることができると思ったが、私はアニメーション化していない。それは正常に変更され、アニメーションブロック内にありますが、アニメーション化されていません。 – Meltemi

+0

私の答えはここにあります: Meltemi

答えて

165

[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}]; 

は含むビューを参照してself.viewを交換してください。

+4

その視点がただちに動くという制約があります。私は何をしますか? ty – dietbacon

+7

これらのビューでも必要に応じてレイアウトを呼び出す必要があります。しかし、実際には正しく表示されないため、ビューのリフレッシュもアニメーション化されます。他のビューでのみ、制約調整をアニメーション化するにはどうすればよいですか? – ngb

+3

**注意:** UIViewAnimationOptionBeginFromCurrentStateを使用する場合、レイアウトの制約が設定されます*アニメーションの前に*! – Robert

11

autolayoutでアニメーションを使用する方法を説明する、Apple自身からの非常に良いチュートリアルがあります。 これに続いてlinkを見つけて、「例で自動レイアウト」というビデオを見つけてください これは、自動レイアウトに関するいくつかの興味深いものを提供し、最後の部分はアニメーションの使い方についてです。

3

this small demo availableを作成しました。これは、非常に簡単な例で、自動レイアウト制約をどのように変更してアニメ化できるかを示しています。単にをご覧ください。

82

これは私のために働く(iOS7とiOS8 +の両方)。調整したい自動レイアウト制約をクリックしてください(例えばインターフェースビルダーの場合、top制約)。次にこれを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]; 
    }]; 
+2

WOW !!これは実際に実際に動作します!この答えは私にとっては目を見張るものでした。大変ありがとうございました! - Erik –

+2

@ErikvanderNeutあまりにも役に立ちました、うれしかったです。私はフレームの位置ではなく、今から制約をアニメートするつもりです。 – DevC

1

ほとんどの人が自分の意見にレイアウト項目に自動レイアウトを使用すると、レイアウトがアニメーションを作成するために、制約変更します。

多くのコードなしでこれを行う簡単な方法は、ストーリーボードでアニメーション化したいUIViewを作成してから、UIViewを終了させる非表示のUIViewを作成することです。 xcodeでプレビューを使用して、両方のUIViewが必要な場所にあることを確認できます。その後、終了UIViewを非表示にし、レイアウトの制約を入れ替えます。

SBPと呼ばれるレイアウト制約をスワップするためのポッドファイルがあります。

Here's a tutorial。これに代えて、制約のIBOutlet reference以上を使用する

0

の必要はありません、あなたは直接accessまたはupdateは、既にいずれかの制約を適用KVConstraintExtensionsMasterライブラリを使用して、任意のビューにProgrammaticallyによって、またはInterface Builderから適用することができます。このライブラリは、NSLayoutConstraintCumulativeビヘイビアも管理しています。私はあなたが簡単に[UIViewのanimateWithDurationにおける制約の一定の値を変更することができることを知っているアニメーション

[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){ 
     if (expectedConstraint) { 
      expectedConstraint.constant = 100; 

      /* for the animation */ 
      [self.containerView updateModifyConstraintsWithAnimation:NULL]; 
     } 
    }];