所以我必须设置包含一个UIScrollView(和子内容视图),有是一系列的成长UILabels和UIViews,并根据内容中包含的收缩子视图一个UIView他们都使用Storyboard中的AutoLayout。这工作时,我有像标签 - 标签 - 标签 - 视图没有任何问题,但是如果我把两个标签之间插入一个空的UIView和UIView插入子视图,我看不到结果我期待。我有一个故事板布局如下:自动布局约束不能按预期工作
...其中的蓝绿色和蓝色的观点是长到无限高度和橙色视图(方式选择)标签是一个空的UIView,我后来注入子观看。窗口上的其他东西是UILabels和UISegment控件。在每行视图之间,我有一个常量为8的垂直空间约束。这一切都运行良好,直到我不得不放入空的UIView并以编程方式注入子视图。我预期的那样工作会是这样的代码(方式选择是彩色的UIView橙色)...
optionsPanel.translatesAutoresizingMaskIntoConstraints = YES;
NSArray *options = [product objectForKey:@"options"];
lastTop = 10;
for(int i=0;i<options.count; i++) {
NSDictionary *option = [options objectAtIndex:i];
NSArray *values = [option objectForKey:@"values"];
if([self hasNoneValue:values] && values.count == 2) {
NSDictionary *value = [self notNoneValue:values];
M13Checkbox *optionCheck = [[M13Checkbox alloc] initWithTitle:[option objectForKey:@"name"]];
optionCheck.frame = CGRectMake(0, lastTop, 280, 25);
[optionsPanel addSubview:optionCheck];
lastTop += 25;
} else {}
}
...其中橙色的UIView会奇迹般地成长,一切只想避开相应推,但是这是我所看到的:
...橙色的UIView完全不生长,而其他两个顶部的UIView什么地方去了屏幕。所以,我的下一个猜测是,关闭屏蔽自动调整大小使用...
optionsPanel.translatesAutoresizingMaskIntoConstraints = NO;
...但我发现这里的一切似乎是工作,但橙色的UIView(方式选择)没有高度的任何结果原因看起来像:
这是越来越接近我所期望的,所以我想我会用这样的代码强制橙色的UIView的高度...
frame = optionsPanel.frame;
frame.size.height = lastTop;
optionsPanel.frame = frame;
...但这似乎对任何事情都没有影响。
纯属猜测,我发现这个代码几乎工作,如果我随意设置optionPanel的起源到的东西比所需要的空间大得多....
optionsPanel.translatesAutoresizingMaskIntoConstraints = YES;
NSArray *options = [product objectForKey:@"options"];
lastTop = 10;
for(int i=0;i<options.count; i++) {
NSDictionary *option = [options objectAtIndex:i];
NSArray *values = [option objectForKey:@"values"];
if([self hasNoneValue:values] && values.count == 2) {
NSDictionary *value = [self notNoneValue:values];
M13Checkbox *optionCheck = [[M13Checkbox alloc] initWithTitle:[option objectForKey:@"name"]];
optionCheck.frame = CGRectMake(0, lastTop, 280, 25);
[optionsPanel addSubview:optionCheck];
lastTop += 25;
} else {}
}
lastTop += 10;
frame = optionsPanel.frame;
frame.size.height = lastTop;
frame.origin.y += 300; //some arbitrarily large number
optionsPanel.frame = frame;
..这给出了这样的结果:
...但显然自动版式已决定将名称标签需要占用额外的空间。它是一种丑陋的方法,但如果我能够弄清楚我需要多少空间,那么如果必须的话,我可以推动一切。在两个动态大小的标签之间建立一个动态UIView的秘诀是什么?
我发现另一种黑客工具,工作是做这样的事情: NSLayoutConstraint *约束= [NSLayoutConstraint constraintWithItem:priceLabel属性:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:方式选择属性:NSLayoutAttributeTop乘数:1不变:lastTop]。 constraint.priority = UILayoutPriorityRequired; [contentView addConstraint:constraint]; 我在其中将定价标签的顶部设置为选项面板的顶部,其中常数是选项面板的高度,这会将所有内容压低。这不是理想的,但工作。 –
实际上,这并不起作用,optionsPanel的高度仅为〜20像素,所以其他复选框不可触摸。 –
您需要在选项面板和其子视图之间建立约束关系,以强制选项面板增长以适应内容。你不是免费的。当你以编程方式添加一个子视图时,默认的自动调整大小掩码是'UIViewAutoresizingNone',它基本上说“保持帧不变”,并且这被转换成自动布局约束并不会影响超级视图的大小。 –