iOS 8中的约束

时间:2014-08-07 04:15:55

标签: objective-c constraints autolayout ios8 xcode6

我正在创建一个带有两个UILabel的表头视图。约束看起来像这样: enter image description here 顶部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中发生变化?

谢谢!

1 个答案:

答案 0 :(得分:1)

问题在于你要求太高的精确度。你不确切知道自动布局系统会给出什么样的高度(你只是添加了一些你认为会给出相同结果的数字),所以当你分配标题视图时固定高度,如果它没有完全匹配系统自己的计算,直到最后一个小数位,就不能满足约束。你应该从来没有这样做过;你正在把苹果与橘子混合(用系统自动布局进行手动计算)。例如,系统可以应用四舍五入,你可以什么都不知道(为了保持集合的积分等)。谁知道它的作用?我惊讶于这一切都有效。

你有两个更好的选择:

  • 在容器视图中包装这对视图(看起来你已经完成了)并只询问容器视图中的systemLayoutSizeFittingSize。这告诉您系统将要做什么。换句话说,不是你计算(命中或未命中),而是要求系统计算。

  • 更好的是,给自己一些松弛:使高度间隔约束中的一个成为不等式或低优先级,这样当你应用固定高度时,约束有权增长或缩小。

    < / LI>