3

自動レイアウトの練習と制約のアニメーションについて学習しています。

私の最初の質問です。ビューを動的に追加する場合、それらの制約を親ビューにも動的に追加するのは面倒です。ビューをプログラムで追加および削除できる柔軟なレイアウトを実現するクリーンな方法はありますか? それとも、これは、私が達成しようとしていることに対して、おそらくより簡単な解決策を考えるべきであることを意味しますか?

2 番目の質問です。2 つのビューと、コード内のいくつかの制約を作成しました。ロード時に最初のビューの高さの制約のサイズを変更して短くしようとしているだけで、それに応じて2番目のビューが上に移動します。

ここにいくつかのコードがあります:

first = [[UIView alloc]initWithFrame:CGRectZero];

[first setBackgroundColor:[UIColor blueColor]];

[first setTranslatesAutoresizingMaskIntoConstraints:NO];

[self.view addSubview:first];



UIView *second = [[UIView alloc]initWithFrame:CGRectZero];

[second setBackgroundColor:[UIColor redColor]];

[second setTranslatesAutoresizingMaskIntoConstraints:NO];

[self.view addSubview:second];



NSLayoutConstraint *leading = [NSLayoutConstraint constraintWithItem:first attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1 constant:20];

NSLayoutConstraint *trailing = [NSLayoutConstraint constraintWithItem:first attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1 constant:-20];


top = [NSLayoutConstraint constraintWithItem:first attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:40];

height = [NSLayoutConstraint constraintWithItem:first attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:80];

[self.view addConstraints:@[leading,trailing,top,height]];

[height setConstant:10];

[UIView animateWithDuration:0.5 animations:^{

    [self.view layoutIfNeeded];

}];

わかりましたので、ここの一番下でアニメーションを実行します。2 番目のビューは、アニメーションの最後になる位置に既に配置されています。最初のビューは、左上隅から右下隅まで拡大します。斜めにアニメーション化され、最終的に高さ 10 になります。

誰でもこの動作を説明できますか? 制約を割り当てて IBAction (ボタン タッチ) でアニメーション化すると、期待どおりにアニメーション化されることに気付きました。

4

2 に答える 2

3

最初に 2 番目の質問。でアニメーションを変更するのはなぜviewDidLoadですか? この時点で、ビューが読み込まれていることがわかりますが、おそらくレイアウトされておらず、ユーザーには表示されません。viewDidLayoutSubviewsメソッドの制約レイアウトの変更を検討してください。

最初の質問について。David Hの答えは1つの方法です...そして完全に良い方法です。別のオプションを提供するために、constraintsWithVisualFormat:options:metrics:views:ビューを指定できるものを使用してから、すべてのビューにわたって必要なすべての制約を作成します。複数のビューにまたがる制約を作成するには、はるかに簡単な方法です。まさにあなたが何をしているかに応じて、あなたのニーズにより適した方法があるかもしれません。

コメントに基づいて編集...

制約を破る必要がある場合でも、新しい制約を作成する前に、制約を見つけて破る必要があります。それを回避する方法はありません。破りたい制約への参照を持っているか、それを見つけるためにオブジェクトのすべての制約を反復処理する必要があります。ABC は AB と C に移動し、B と C の間の制約がなくなります。ビジュアル形式を使用して X を入力すると、@"[B]-20-[X]-20-[C]" のようになり、B と X の間に 20 ポイントの間隔の制約が作成され、2 つ目の制約が作成されます。 X と C の間の 20 ポイントの間隔である必要があります。注として、上記の視覚的な形式は、水平方向の配置/間隔のみを指定しています。垂直方向の制約を指定するには、2 行目が必要になります。

于 2013-11-01T18:41:06.533 に答える