NSLayoutConstraints并动态设置视图的宽度/高度

Sea*_*ser 32 xcode objective-c ios nslayoutconstraint

我有一个关于设置视图大小的问题,我正在应用一些布局约束.
如何在不定义视图的情况下定义视图的大小?

我正在尝试创建一个高度固定且在屏幕原点具有原点的视图.它填充视图的宽度,以便在设备旋转时视图延伸到屏幕的宽度.这是我到目前为止所得到的......

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];
Run Code Online (Sandbox Code Playgroud)

问题是除非我设置框架,否则我无法在屏幕上显示任何内容containerView.在不使用Interface Builder的情况下执行此操作的正确方法是什么?

Cha*_*ira 49

我写了一个小工具来帮助你:

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)]];
Run Code Online (Sandbox Code Playgroud)

迅速

// 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]));
Run Code Online (Sandbox Code Playgroud)

  • 5 年后,您的工具能够帮助我在以编程方式创建布局时不必用头撞墙。谢谢! (2认同)

mat*_*att 46

要使用布局约束定义视图的高度和宽度,您可以使用布局约束来定义视图的高度和宽度.例如,您已经说过:

NSArray *verticalConstraints = 
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-250-|" 
    options:0 metrics:nil views:viewsDictionary];
Run Code Online (Sandbox Code Playgroud)

所以你可以改为:

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

现在,视图将从其超视图顶部50像素,高40像素.

或者,您可以使用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:设置高度约束; toItem当然,这将是零,因为与另一种观点没有任何关系.


Lui*_*smi 8

比以后更好......

对于Storyboard,IB和Swift:

只需控制 - 将您的约束像任何其他控件一样拖动到viewController

@IBOutlet weak var spaceToTopThatIDecided: NSLayoutConstraint!
Run Code Online (Sandbox Code Playgroud)

然后简单地改变它:

spaceToTopThatIDecided.constant = 44
Run Code Online (Sandbox Code Playgroud)

就这样!