systemLayoutSizeFittingSize:在UILabel上的行为不像预期的那样

时间:2014-08-28 18:51:05

标签: ios cocoa-touch swift autolayout

我发现systemLayoutSizeFittingSize:方法的行为与我预期的不同。

这是一个快速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()

我原本预计layoutSizeintrinsicSize是相同的。

但在这种情况下,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 个答案:

答案 0 :(得分:3)

内在大小是内容视图的计算,您可以在示例中获得预期结果。另一方面,layoutSize取决于视图的约束,因为您没有定义任何系统使用默认的不使用内在大小的系统。但是如果你使用为标签添加一些约束,即在视图中垂直和水平居中,那么系统将使用内在内容大小来最终确定布局,两种尺寸都是相同的。

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}