2014-08-28 66 views
5

我發現systemLayoutSizeFittingSize:方法的不同行爲,然後我預期。systemLayoutSizeFittingSize:在UILabel上表現不像預期的那樣

這裏是剪斷了迅速遊樂場這表明了行爲,但其在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() 

不會改變結果

回答

3

的固有大小是內容的視圖的計算,你在你的例子得到預期的結果。另一方面,layoutSize取決於視圖的約束,因爲您沒有定義任何不使用內部大小的系統默認值。但是,如果您使用向標籤添加一對約束,即在視圖的垂直和水平居中,那麼系統將使用內在內容大小來最終確定佈局,並且兩個大小都是相同的。

代碼例如在目標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 [email protected]"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} 
相關問題