【问题标题】:Constraints in iOS 8iOS 8 中的约束
【发布时间】:2014-09-30 04:40:17
【问题描述】:

我正在创建一个带有两个 UILabel 的表头视图。约束如下所示: 顶部的 UILabel 连接到容器的顶部、前缘和后缘。底部 UILabel 的前缘和后缘与顶部标签对齐,底部边缘与容器底部对齐。两个 UILabel 之间还有一个垂直间距约束。当然,所有视图 translatesAutoresizingMaskIntoConstraints 都已设置为 NO。顺便说一句,整个事情都是用代码制作的。

我通过获取每个标签和填充的固有内容大小来计算 UIView 的高度,以便我可以创建容器视图的矩形并将其添加到 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 中约束的逻辑是否发生了变化?

谢谢!

【问题讨论】:

    标签: objective-c constraints autolayout ios8 xcode6


    【解决方案1】:

    问题是您要求的精度太高。您不知道自动布局系统将给出的确切高度(您只是将一些数字相加,您认为会给出相同的结果),因此当您为标题视图分配固定高度时,如果不能完美匹配系统自己的计算,精确到小数点后一位,就不能满足约束条件。你一开始就不应该那样做;您正在将苹果与橙子混合(使用系统的自动布局进行手动计算)。例如,系统可能会应用您一无所知的舍入(以保持矩形积分等)。谁知道它是做什么的?我很惊讶这竟然奏效了。

    你有两个更好的选择:

    • 将这对视图包装在一个容器视图中(看起来您已经这样做了),然后向容器视图询问其systemLayoutSizeFittingSize。这会准确地告诉您系统将做什么。换句话说,不是你计算(命中或未命中),而是要求系统计算。

    • 更好的是,让自己放松一下:将高度间隔约束之一设为不等式或降低优先级,这样当您应用固定高度时,该约束就可以增长或缩小。

    【讨论】:

    • 感谢马特的回复。我知道我正在混合使用苹果和橙子,但是在将视图添加为表格视图标题时,我从未能够添加纯自动布局托管视图。虽然我确实要求非常精确,但我并不是真的猜到了。填充是静态的,我用“gsSizeWithFont: withMaximumSize:”计算标签高度,你在那里看到,所以它总是精确的。但我会尝试不等式的想法。
    • 当我将视图添加到表格视图时,问题甚至没有出现。它发生在我创建约束并调用 layoutIfNeeded 之后。在这种情况下,容器的高度和宽度尚未设置。我尝试将它们设置为最低优先级以使其具有弹性,并且看起来它们被覆盖了。当我看到崩溃日志时,即使我将容器的高度设置为不同的值,它也是 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多