自动布局 - 使视图的尺寸依赖于另一个视图的
Posted
技术标签:
【中文标题】自动布局 - 使视图的尺寸依赖于另一个视图的【英文标题】:Auto Layout - make a view's dimensions dependent on another view's 【发布时间】:2013-12-09 16:57:30 【问题描述】:简单的交易:我想将 UIView 的宽度设为其父视图宽度的一半。这是我的代码:
//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
,则视图的宽度是其父视图的一半。但这是为什么呢?
【问题讨论】:
在self.view
上设置背景颜色可能很有用,只是为了确保它也是您期望的大小。
完成,我更新了问题和截图。这是一个新的 UIViewController,所以 self.view
应该有默认尺寸。
这段代码在哪里调用?视图加载?一个单独的方法?如果在 viewDidLoad 之后调用,请尝试调用 [self.view layoutIfNeeded]。
是的,它在viewDidLoad
中调用。我试过打电话给[self.view layoutIfNeeded]
,但没有帮助。如果您将其复制并粘贴到空 ViewController 的 viewDidLoad
中,您应该会得到相同的结果。
layoutIfNeeded
应该不是必需的,因为只要添加了约束,视图就会自动再次运行布局。
【参考方案1】:
问题可能是您的红框视图约束不足。你给了它一个宽度,但没有告诉它它应该水平放置自己的位置。由于它应该是父视图宽度的一半,它可以选择将自己定位在父视图的左半边。或者右半边。或者中间。你没有指定,所以框架只是选择了一些东西。
在这种情况下,它看起来像是选择将红色框的 center 与 superview 的左边缘对齐。这似乎是一个奇怪的选择,但同样,您没有指定任何内容。它可以选择任何它想要的东西。
添加另一个将视图水平定位的约束。这应该可以解决问题。
【讨论】:
你是对的。我的代码 为子视图提供了正确的大小,但其中一部分位于视图框架之外。我不得不添加这个:constraint = [NSLayoutConstraint constraintWithItem:redBox attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0 ];
以上是关于自动布局 - 使视图的尺寸依赖于另一个视图的的主要内容,如果未能解决你的问题,请参考以下文章