9

単一の NSView を持つ新しいアプリケーションで作成されたデフォルトの NSWindow があります。次に、独自の XIB とビューを持つ新しい NSViewController を作成します。アプリのデリゲートでは、明らかなことを行います

self.mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
[self.window.contentView addSubview:self.mainViewController.view];
self.mainViewController.view.frame = ((NSView*)self.window.contentView).bounds;

OK、新しい方法で制約を設定して、サブビューをウィンドウと同じサイズに保つにはどうすればよいですか。つまり、スーパービューです。自動では動かないようです。サブビューの自動サイズ変更は、両方のビューでオンになっています。

4

6 に答える 6

8

基本的に、次の 4 つのことを制約する必要があります。

  1. スーパービューへのサブビューの先行スペースをゼロにする
  2. スーパービューへのサブビューの上部スペースをゼロにする
  3. サブビューのをスーパービューの幅と等しくする
  4. サブビューの高さをスーパービューの幅と等しくする

視覚的な制約がうまくいかない場合は、コードでこれら 4 つの制約を個別に作成できます。メソッド+constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier: constant:を使用して、異なるビューの属性間の正確な関係を指定します。たとえば、上記の制約 #1 は次のように表現できます。

[NSLayoutConstraint constraintWithItem:mySubview
                             attribute:NSLayoutAttributeLeading
                             relatedBy:NSLayoutRelationEqual
                                toItem:mySuperview
                             attribute:NSLayoutAttributeLeading
                            multiplier:1.0f
                              constant:0.0f]

#3は次のようになります。

[NSLayoutConstraint constraintWithItem:mySubview
                             attribute:NSLayoutAttributeWidth
                             relatedBy:NSLayoutRelationEqual
                                toItem:mySuperview
                             attribute:NSLayoutAttributeWidth
                            multiplier:1.0f
                              constant:0.0f]

これら 4 つの制約を作成したら、必要に応じてそれらをスーパービューに追加できます。

上記と同じ効果を得るには複数の方法があることに注意してください。

  • 幅と高さではなく、末尾のスペース下部のスペースを制限する場合があります
  • 先頭と上部のスペースの代わりに、中心 X中心 Yを制約する場合があります。

Peter Hosey's answer のように、視覚的表現で同じ制約を考え出すこともできます。たとえば、等幅制約は@"[mySubview(==mySuperview)]"、適切なビュー ディクショナリのように見える場合があります。

Auto Layout Guideは、問題が発生した場合のデバッグ方法など、制約に関する豊富な情報であることに注意してください。

于 2012-12-03T19:41:25.257 に答える
4

nib エディターで、サブビューのサイズをスーパービューと同じサイズになるまでドラッグします。Xcode は、適切な幅の制約を自動的に作成します。

コードでは、試してみます(制約構文ドキュメント|-0-[mySubview]-0-|の例から適応)。

于 2012-11-14T18:34:43.643 に答える
2

Peter が書いたように、ビジュアル フォーマット言語を使用する必要があります。

ただし、これを行う場合、順序が重要です。制約を作成する場合、制約が参照するすべてのビューが同じビュー階層の一部である必要があります。

したがって、あなたの例を考えると、コードは次のようになる必要があります。

self.mainViewController = [[MainViewController alloc] initWithNibName:@"MainViewContoller" bundle:nil];
NSView *containerView = self.window.contentView;
NSView *contentView = self.mainViewController.view;
[contentView setTranslatesAutoresizingMaskIntoConstraints: NO];
[containerView addSubview:contentView];

NSDictionary *viewBindings = NSDictionaryOfVariableBindings(contentView);
[containerView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:nil views:viewBindings]];
[containerView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:viewBindings]];
于 2012-12-03T19:59:33.197 に答える
0

setContentView:、contentView:、および contentRectForFrameRect: をオーバーライドして、window.frame サイズのビューを処理できるようにします。

于 2012-12-05T19:06:49.403 に答える
-1

私は同じ問題を抱えていて、SDK 10.10で動作するこのソリューションになりました。autoresizingMask新しいビューの を親ウィンドウと同じに設定するだけです。1行のコードだけで、魅力的に機能します...

self.masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];

[self.window.contentView addSubview:self.masterViewController.view];
self.masterViewController.view.frame = ((NSView *)self.window.contentView).bounds;
self.masterViewController.view.autoresizingMask = ((NSView *)self.window.contentView).autoresizingMask;
于 2014-11-02T20:26:01.173 に答える