0

コードで作成された制約を理解するのに多くの問題があります。IBで作成および設定されたこのコンテナビューがあり、そのコンテナNSViewのinitWithFrameに、次のように子NSViewを追加します(selfはコンテナビューです):

childView = [[NSView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, tabContainerHeight + tabContainerTopSpace)];
[childView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:childView];

NSLayoutConstraint *tabContainerConstraint = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f];
[childView addConstraint:tabContainerConstraint];

tabContainerConstraint = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f];
[childView addConstraint:tabContainerConstraint];

tabContainerConstraint = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:0.0f];
[childView addConstraint:tabContainerConstraint];

現在の問題は、子ビューがまったく表示されないことです。何が起こるかわかりません。私がしたいのは、子ビューの上部が常にコンテナー ビューの上部に正確に配置されるようにすることです。左右についても同じことが言えます。したがって、子ビューの高さは固定する必要がありますが、常にコンテナー ビューの上部に配置する必要があります。次に、コンテナビューで側面に伸ばします(説明されている場合は、添付の画像のように)。

ここに画像の説明を入力

これはコードからどのように行われますか?

ありがとうござい
ます

4

1 に答える 1

0

ここにはいくつかの問題があります。

まず、自動レイアウトを使用initWithFrame:してからオンにします。これは、フレーム情報が破棄されることを意味します。子ビューには高さの制約が必要です。

次に、スーパービューではなく子ビューに制約を追加しています。自動レイアウト システムはこれを把握できるかもしれませんがself、この場合は制約を実際に追加する必要があります。

デバッガーまたは Reveal などのイントロスペクション ツールでビューのフレームをチェックして、問題が発生している可能性がある場所を確認できます。この場合、子ビューの高さがゼロになっていると思います。

第三に (これは必ずしも問題ではありません)、使用しているコードが不必要に冗長です。個別の作成形式は、作成している制約を理解するのに役立ち、複雑な階層間の制約には適していますが、あいまいなレイアウトになったり、間違ったビューに制約を追加したりする可能性があります。あなたが求めているレイアウトは、ビジュアル フォーマット言語を使用するのに適しています。これは、次の 2 つのステートメントだけです。

水平レイアウトの場合:

@"|[childView]|"

垂直レイアウトの場合:

@"V:|[childView(==height)]"

は、メトリックディクショナリheightのキーであるか、ハードコードされた高さの数値に置き換えます。

コードで制約を作成するさまざまな方法について、退屈な詳細を書いてきました:ビジュアル フォーマット言語個々の制約。これらは iOS に焦点を当てていますが、自動レイアウトは両方のフレームワークで非常に似ています。

于 2013-10-07T14:24:09.487 に答える