web-dev-qa-db-ja.com

自動レイアウト制約によるUIViewアニメーション化された変更

次のようなプロジェクトがあるとします。

enter image description here

UIViewが2つあります。1つはyellowBoxと呼ばれ、もう1つはredBoxと呼ばれます。自動レイアウトの制約は、yellowBoxがスーパービューの上部から60ポイントで、350ポイントの前後スペース(つまり、ビューの左右)であることを示しています。 redBoxには、先頭と末尾に同じスペース制約があります。 0の2つのボックスの間に垂直スペースの制約があり、yellowBoxの下部が常にredBoxの上部に常にあることを示します。

ユーザーが[黄色のボックスを展開]ボタンをタップすると、yellowBoxの高さが増加し、その結果、redBoxが下に移動して垂直スペースの制約を満たし続けます( yellowBoxは常にredBoxの上にあります)。アニメーションコードは次のとおりです。

- (IBAction)expandYellowBox:(id)sender {

    [UIView animateWithDuration:0.5
                     animations:^{
                         CGRect newFrame = self.yellowBox.frame;
                         newFrame.size.height += 50;
                         self.yellowBox.frame = newFrame;
                     }];

}

しかし、私はこれを正しく機能させることができませんでした。赤いアイコンでわかるように、現時点では制約に問題があります。

enter image description here

自動レイアウトがボックスの高さを知る方法がないため、これは十分に公平です。ただし、ボックスのサイズを変更したり移動したりできるように、この問題を解決する方法はわかりません。たとえば、yellowBoxに高さの制約を指定すると、サイズの変更ができなくなります。高さの制約を以上に設定した場合(yellowBoxの高さを増加できるように)、別の制約を取得しますエラー:

enter image description here

すべての制約は、ストーリーボードのXcodeを使用して確立されています-コードで記述されたものはありません。

どんな助けも大歓迎です。


編集:結局のところ、ボタンをクリックするとyellowBoxが大きくなります-redBoxの後ろに表示されるため、わかりません。約4回クリックした後に気づいただけで、redBoxの下部に表示され始めました。ただし、同じ質問が残っています-redBoxを常にyellowBoxの下部に固定する方法。

27
Skoota

shwet-solanki で述べたように試してみてください。ただし、制約を変更した後に次の行を追加してください。

[self.view layoutIfNeeded];

iBActionは次のようになります。

- (IBAction)expandYellowBox:(id)sender {

[UIView animateWithDuration:0.5
                 animations:^{
                     self.yellowBoxHeightConstraint.constant += 50;
                     [self.view layoutIfNeeded];
                 }];
}

ここで、yellowBoxHeightConstraintは、IBOutletの高さ制約のyellowBoxです。お役に立てれば。

82
GoGreen
  1. 両方のビューに高さの制約を追加します
  2. Yellowboxの高さの制約のためにIBOutletを作成します
  3. ボタンが押されたイベントでイエローボックスの高さを変更する代わりに、高さの制約の値を変更します。つまり、IBOutletの制約名がyellowBoxHeightConstraintで、その後yellowBoxHeightConstraint.constant += 50;

これがあなたのために働くことを願っています。

4
Shwet Solanki
//
//  WPViewController.h
//  AutoLayoutTEst
//
//  Created by VASANTH K on 09/01/14.
//  
//

#import <UIKit/UIKit.h>

@interface WPViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *button1;
- (IBAction)buttClicked:(id)sender;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *heightConstrain;

@property (strong, nonatomic) IBOutlet UIButton *button2;
@end

クリックイベント

- (IBAction)buttClicked:(id)sender {


    self.heightConstrain.constant=100;


}

ここで、黄色のボタンにheightConstrainを設定してから、そのボタンの参照アウトレットを作成し、heightConstrainを更新してそのボタンのサイズを更新する必要があります。

https://github.com/vasanth3008/AutoLayoutHeighDemo

サンプルデモプロジェクトを参照してください

1
CoolMonster