9

iOS の自動レイアウトは初めてです。私は原則としてこのコンセプトが本当に好きですが、最も単純なことを成し遂げようとするのは気が狂ってしまいます. 単純な基本原則がまだ欠けているのではないかと思います。アプリで実際に作業する前に、基本を習得して習得しようとしているので、非常に単純なテスト プロジェクトを作成しています。これは、期待どおりに機能しない単純なものです。まずは動く部分。IB では、viewcontroller 全体を埋めるビューを追加すると、XCode は自動的に制約を Top/Bottom/Leading/Trailing に設定し、Space を 0 に設定します。IB を使用すると、期待どおりに動作します。

ここに画像の説明を入力

に回転します

ここに画像の説明を入力

すごい!

今、私はコードで同じことをしようとしています:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIView *redView = [[UIView alloc] initWithFrame:self.view.bounds];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];

redView.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]];
}

シングルビュー アプリケーションのデフォルト コード以外のコードはこれですべてです。

上記のコードを実行すると、プログラムで IB を使用して取得したものと同じものをミラーリングしようとすると、ローテーション後に次のようになります。

ここに画像の説明を入力

同じ制約が異なる結果につながるのはなぜですか? 私が見逃しているのは、おそらく本当に単純で恥ずかしいほど愚かなことです。ヘルプ!!!

4

3 に答える 3

7

これは古いことは知っていますが、制約の問題は、末尾などが表すものを混乱させていたことだと思います。コードを次のように修正したところ、期待どおりに画面がいっぱいになりました。

       UIView *redView = [[UIView alloc] initWithFrame:self.view.bounds];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];

redView.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:redView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]];

末尾の制約を下部に等しく設定していました(末尾は実際には下部ではなく右側であり、上部の制約を左側に関連付けていました(先頭)

于 2015-04-08T10:38:11.223 に答える
6

これを行う方法は次のとおりです。

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:NSDictionaryOfVariableBindings(redView)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[redView]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:NSDictionaryOfVariableBindings(redView)]];

IB での AutoLayout は面倒な場合があり、ビジュアル フォーマット言語に慣れるのにかかる作業は、constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: よりも少ないことがわかりました。

于 2013-06-21T19:47:33.553 に答える
1

Leading と Trailing の代わりに、Top と Bottom を使用します。元の投稿でこれらを混同していることに注意してください。リーディングとトレーリングは人々を混乱させるようです!

于 2013-06-22T00:53:30.580 に答える