レイアウトの制約を適用するビューのサイズの設定について質問があります。
フレームを定義せずにビューのサイズを定義するにはどうすればよいですか?
高さを固定し、画面の原点に原点を持つビューを作成しようとしています。デバイスが回転すると、ビューが画面の幅まで広がるように、ビューの幅を埋めます。これは私がこれまでに持っているものです...
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を使用せずにこれを行う正しい方法は何ですか?
レイアウト制約を使用してビューの高さと幅を定義するには、レイアウト制約を使用してビューの高さと幅を定義します。たとえば、あなたはすでに言っています:
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になります。別のビューとの関係がないためです。
これを支援する小さなツールを作成しました。
http://autolayoutconstraints.com
// 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]));
後より良い...
ストーリーボード、IB、およびSwiftの場合:
他のコントロールと同様に、コンストレインをviewControllerにコントロールドラッグするだけです。
@IBOutlet weak var spaceToTopThatIDecided: NSLayoutConstraint!
次に、単に変更します。
spaceToTopThatIDecided.constant = 44
それで全部です!
addConstraints :()メソッドを使用する必要はありません
- (void)addConstraint:(NSLayoutConstraint *)constraint NS_AVAILABLE_MAC(10_7);
//このメソッドは廃止されているため、使用しないでください。代わりに、NSLayoutConstraintのactiveプロパティを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 documentation
//次に、次のような制約を追加します
[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)]];
// それでおしまい。
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]))