Ios 自动布局-创建视图';s尺寸取决于另一个视图';s
简单的交易:我想让UIView的宽度为superview宽度的一半。这是我的密码: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
//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];