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将为零,因为与另一个视图没有关系。

于 2012-11-26T18:42:25.563 回答
9

迟到总比没有好...

对于 Storyboard、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 的 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 文档中读取

// 然后添加约束,如

[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 回答