UILabel上的systemLayoutSizeFittingSize:行为与预期不符

5
我发现systemLayoutSizeFittingSize:方法的行为与我的预期不同。
这里有一个 Swift Playground 的代码片段,演示了这个行为,但在 Objective-C 中也是一样的:
import UIKit
import Foundation

var label = UILabel()

label.text = "This is a Test Label Text"

label.numberOfLines = 0

label.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody)

label.preferredMaxLayoutWidth = 40

let layoutSize = label.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)

let intrinsicSize = label.intrinsicContentSize()

我本以为`layoutSize`和`intrinsicSize`是相同的。但在这种情况下,`layoutSize`是`(w 173, h 20)`,而`intrinsicSize`是`(w 40, h 104)`。我期望两者都是`intrinsicSize`,但似乎`systemLayoutSizeFittingSize:`忽略了`preferredMaxLayoutWidth`。有人能向我解释一下吗?
编辑:同时
label.setNeedsLayout()
label.layoutIfNeeded() 

let layoutSize = label.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)

let intrinsicSize = label.intrinsicContentSize()

不会改变结果

1个回答

3

内在大小是内容视图的计算,你得到了预期的结果。另一方面,布局大小取决于视图的限制条件,由于你没有定义任何限制条件,系统使用默认限制条件,不使用内在大小。但如果你给标签添加一对约束条件,比如垂直和水平方向上居中于视图中心,则系统将使用内在内容大小最终确定布局,两个大小将相同。

Objective-C示例代码:

//This code assume you have a UILabel as IBOutlet named testLabel with two constrains
// to center the view, then in "viewDidLoad:"
self.testLabel.text =@"This is a Test Label Text";
self.testLabel.font = [UIFont preferredFontForTextStyle:(UIFontTextStyleBody)];
self.testLabel.numberOfLines = 0;
self.testLabel.preferredMaxLayoutWidth = 40;


CGSize layoutSize1 = [_testLabel systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

CGSize intrinsicSize1 = [_testLabel intrinsicContentSize];

NSLog(@"\nlayout:%@\nintrinsicSize:%@",NSStringFromCGSize(layoutSize1),NSStringFromCGSize(intrinsicSize1));

对于这个案例,输出结果为:
2015-01-29 01:00:46.265 test[31327:911898] 
layout: {38.5, 130.5} 
intrinsicSize:{38.5, 130.5}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接