Ios 自动布局-创建视图';s尺寸取决于另一个视图';s

Ios 自动布局-创建视图';s尺寸取决于另一个视图';s,ios,uikit,autolayout,Ios,Uikit,Autolayout,简单的交易:我想让UIView的宽度为superview宽度的一半。这是我的密码: //Display a red rectangle: UIView *redBox = [[UIView alloc] init]; [redBox setBackgroundColor:[UIColor redColor]]; [redBox setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addSubview:redBox]; //M

简单的交易:我想让UIView的宽度为superview宽度的一半。这是我的密码:

//Display a red rectangle:
UIView *redBox = [[UIView alloc] init];
[redBox setBackgroundColor:[UIColor redColor]];
[redBox setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:redBox];

//Make its height equal to its superview's,
//minus standard spacing on top and bottom:
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[redBox]-|" options:0 metrics:nil views:@{@"redBox": redBox}];
[self.view addConstraints:constraints];

//Make its width half of its superviews's width (the problem):
NSLayoutConstraint *constraint = [NSLayoutConstraint
                                  constraintWithItem:redBox
                                  attribute:NSLayoutAttributeWidth
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:self.view
                                  attribute:NSLayoutAttributeWidth
                                  multiplier:0.5
                                  constant:0.0
                                  ];

[self.view addConstraint:constraint];

[self.view setBackgroundColor:[UIColor blueColor]];
这就是我得到的:


如果我将
multiplier
设置为
1.0
,则视图的宽度是其superview的一半。但为什么呢

问题可能是您的红盒视图受约束不足。你给了它一个宽度,但是没有告诉它应该水平放置在哪里。因为它应该是superview宽度的一半,所以它可以选择将自己定位在superview的左半部分。或者右半部分。或者中间。您没有指定,因此框架只能选择一些内容

在本例中,它似乎选择将红色框的中心与superview的左边缘对齐。这似乎是一个奇怪的选择,但同样,您没有指定任何内容。它可以选择它想要的任何东西


添加另一个将水平放置视图的约束。这应该可以解决问题。

问题可能是您的红框视图受约束。你给了它一个宽度,但是没有告诉它应该水平放置在哪里。因为它应该是superview宽度的一半,所以它可以选择将自己定位在superview的左半部分。或者右半部分。或者中间。您没有指定,因此框架只能选择一些内容

在本例中,它似乎选择将红色框的中心与superview的左边缘对齐。这似乎是一个奇怪的选择,但同样,您没有指定任何内容。它可以选择它想要的任何东西


添加另一个将水平放置视图的约束。这应该可以解决问题。

self.view
上添加背景色可能会很有用,只是为了确保它也是您期望的大小。完成后,我更新了问题和屏幕截图。它是一个全新的UIViewController,因此
self.view
应该具有默认维度。此代码在哪里调用?视图加载?另一种方法?尝试调用[self.view layoutifneed],如果在viewDidLoad.yep之后调用,则在
viewDidLoad
中调用。我试着打电话给
[self.view layoutifneed]
,但没用。如果将其复制并粘贴到空ViewController的
viewDidLoad
中,您应该会得到相同的结果。
layoutIfNeeded
应该不是必需的,因为每当添加约束时,视图将自动再次运行layout。在
self.view
上添加背景色可能会很有用,只是为了确保它也是您期望的大小。完成后,我更新了问题和屏幕截图。它是一个全新的UIViewController,因此
self.view
应该具有默认维度。此代码在哪里调用?视图加载?另一种方法?尝试调用[self.view layoutifneed],如果在viewDidLoad.yep之后调用,则在
viewDidLoad
中调用。我试着打电话给
[self.view layoutifneed]
,但没用。如果将其复制并粘贴到空的ViewController的
viewDidLoad
中,您应该会得到相同的结果。
layoutIfNeeded
应该不是必需的,因为每当添加约束时,视图将自动再次运行layout。您是对的。我的代码为子视图提供了正确的大小,但其中一部分超出了视图的框架。我必须添加以下内容:
constraint=[NSLayoutConstraint constraintWithItem:redBox属性:NSLayoutAttributeReading relatedBy:NSLayoutRelationEqual-toItem:self.view属性:NSLayoutAttributeReading乘数:1.0常量:0.0];
你说得对。我的代码给了子视图正确的大小,但其中一部分超出了视图的框架。我必须添加以下内容:
约束=[NSLayoutConstraint constraintWithItem:redBox属性:NSLayoutAttributeReading relatedBy:NSLayoutRelationEqual-toItem:self.view属性:NSLayoutAttributeReading乘数:1.0常量:0.0];