33

いくつかのレイアウト制約を適用するビューのサイズの設定について質問があります。
フレームを定義せずにビューのサイズを定義するにはどうすればよいですか?

高さが固定され、画面の原点を原点とするビューを作成しようとしています。ビューの幅全体に表示されるため、デバイスを回転させると、ビューは画面の幅まで広がります。これは私がこれまでに持っているものです...

self.containerView = [[HitTestContainerView alloc] init];
[self.containerView setBackgroundColor:[UIColor redColor]];
[self.view addSubview:self.containerView];

NSDictionary *viewsDictionary = @{@"view":self.containerView};
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-250-|" options:0 metrics:nil views:viewsDictionary];
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:verticalConstraints];
[self.view addConstraints:horizontalConstraints];

問題は、そのフレームを設定しないと、画面に何も表示されないことcontainerViewです。Interface Builderを使用せずにこれを行う正しい方法は何ですか?

4

5 に答える 5

52

私はこれを支援する小さなツールを書きました:

http://autolayoutconstraints.com

ツールによって自動生成された質問への回答は次のとおりです

Objective-C

// align view from the left and right
[self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[view]-10-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];

// width constraint
[self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view(==250)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];

// height constraint
[self.containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view(==50)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(view)]];

迅速

// align view from the left and right
self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[view]-10-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view]));

// width constraint
self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[view(==250)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view]));

// height constraint
self.containerView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[view(==50)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": view]));
于 2014-06-02T12:30:42.547 に答える
47

レイアウト制約を使用してビューの高さと幅を定義するには、レイアウト制約を使用してビューの高さと幅を定義します。たとえば、あなたはすでに言っています:

NSArray *verticalConstraints = 
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-250-|" 
    options:0 metrics:nil views:viewsDictionary];

したがって、これを次のように変更できます。

NSArray *verticalConstraints = 
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(50)-[view(40)]" 
    options:0 metrics:nil views:viewsDictionary];

これで、ビューはスーパービューの上部から50ピクセル、高さは40ピクセルになります。

constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:または、を使用して高さの制約を設定することもできます。toItemもちろん、別のビューとの関係がないため、nilになります。

于 2012-11-26T18:42:25.563 に答える
9

決して遅くなるよりはまし...

ストーリーボード、IB、およびSwiftの場合:

コントロール-他のコントロールと同じように制約をviewControllerにドラッグします

@IBOutlet weak var spaceToTopThatIDecided: NSLayoutConstraint!

次に、それを簡単に変更します。

spaceToTopThatIDecided.constant = 44

それで全部です!

于 2014-10-22T19:06:20.093 に答える
4

addConstraints :()メソッドを使用する必要はありません

- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_MAC(10_7);

//このメソッドは非推奨であり、避ける必要があります。代わりに、NSLayoutConstraintのアクティブプロパティをYESに設定します。

- (void)addConstraints:(NSArray *)constraints NS_AVAILABLE_MAC(10_7);   

//このメソッドは非推奨であり、避ける必要があります。代わりに使用する

+[NSLayoutConstraint activateConstraints:].

//使用する必要があります

+ (void)activateConstraints:(NSArray *)constraints NS_AVAILABLE(10_10, 8_0);

//次に次のように設定します

NSView *view,*containerView;
view =//superview
containerView=//subview
[view addSubview:containerView];

//制約を追加します

[containerView setTranslatesAutoresizingMaskIntoConstraints:NO];

//それについてAppleのドキュメントから読む

//次に次のような制約を追加します

[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-50-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(containerView)]];
[NSLayoutConstraint activateConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(containerView)]];

// それでおしまい。

于 2015-05-29T08:40:03.477 に答える
0

Swift 4: 以下の2つのオプションだけで、リーディング、トレーリング、上下のスペースに加えて、幅と高さを管理できます

 //1 . left and right spacing
    theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[view]-16-|", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

 //2. top and bottom spacing
    theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[view]-16-|", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

または より具体的に、W、H、左間隔、上間隔に個別の制約を設定するには、次のようにします。

 //left only spacing
        theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-16-[view]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

//top only spacing
        theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-16-[view]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

//width
        theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[view(==130)]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))

//height
        theContentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[view(==100)]", options:NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":nibView]))
于 2017-10-16T12:09:17.917 に答える