我正在创建一个带有两个UILabel的表头视图。约束看起来像这样: 顶部UILabel连接到容器的顶部,前部和后部边缘。底部UILabel的前缘和后缘与顶部标签对齐,底边与底部边缘对齐。两个UILabel之间还存在垂直间距约束。所有视图 translatesAutoresizingMaskIntoConstraints 当然已设置为NO。顺便说一下,整件事都是用代码制作的。
我通过获取每个标签和填充的内在内容大小来计算UIView的高度,以便我可以创建容器视图的rect并将其添加到UITableView。像这样:
-(float)calculateHeightwithMaxWidth:(float)maxWidth
{
float totalHeight = 0;
const float containerPadding = 30;
const float maxHeight = 1000;
maxWidth = maxWidth - containerPadding;
UIFont *nameFont = [UIFont fontWithName:@"AvenirNext-Regular" size:18];
UIFont *descriptionFont = [UIFont fontWithName:@"AvenirNext-Regular" size:13];
CGSize nameSize = [_productNameLabel.text gsSizeWithFont:nameFont
withMaximumSize:CGSizeMake(maxWidth, maxHeight)];
CGSize descriptionSize = [_productDescriptionLabel.text gsSizeWithFont:descriptionFont
withMaximumSize:CGSizeMake(maxWidth, maxHeight)];
totalHeight = nameSize.height + descriptionSize.height + containerPadding;
return totalHeight;
}
此代码在iOS 7中完美运行,并且已经为多个版本工作。现在我在iOS 8中进行测试时遇到了令人不满意的限制。如果在调用layoutIfNeeded之前看到视图的约束,一切看起来都很棒,但在调用之后我看到两个新的约束,即容器视图的宽度和高度约束。我从未创建过这种约束,并且在iOS 7中从不需要。
即使在我自己创建这些约束来解决这个问题之后,我也会遇到更多错误。我错过了什么吗?约束的逻辑是否在iOS 8中发生变化?
谢谢!
答案 0 :(得分:1)
问题在于你要求太高的精确度。你不确切知道自动布局系统会给出什么样的高度(你只是添加了一些你认为会给出相同结果的数字),所以当你分配标题视图时固定高度,如果它没有完全匹配系统自己的计算,直到最后一个小数位,就不能满足约束。你应该从来没有这样做过;你正在把苹果与橘子混合(用系统自动布局进行手动计算)。例如,系统可以应用四舍五入,你可以什么都不知道(为了保持集合的积分等)。谁知道它的作用?我惊讶于这一切都有效。
你有两个更好的选择:
在容器视图中包装这对视图(看起来你已经完成了)并只询问容器视图中的systemLayoutSizeFittingSize
。这告诉您系统将要做什么。换句话说,不是你计算(命中或未命中),而是要求系统计算。
更好的是,给自己一些松弛:使高度间隔约束中的一个成为不等式或低优先级,这样当你应用固定高度时,约束有权增长或缩小。
< / LI>