2014-08-28 18 views
5

Znalazłem inne zachowanie metody systemLayoutSizeFittingSize: niż się spodziewałem.systemLayoutSizeFittingSize: na UILabel nie zachowuje się jak oczekiwano

Oto kod snipped do szybkiego Playground który demonstruje zachowanie, ale jego samego w 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() 

Liczyłam, że layoutSize i intrinsicSize są takie same.

ale w tym przypadku layoutSize jest (w 173, h 20) i intrinsicSize jest (w 40, h 104)

Spodziewam się zarówno za intrinsicSize ale wydaje systemLayoutSizeFittingSize: ignoruje preferredMaxLayoutWidth

Czy ktoś może mi to wyjaśnić?

Edit: także

label.setNeedsLayout() 
label.layoutIfNeeded() 

let layoutSize = label.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 

let intrinsicSize = label.intrinsicContentSize() 

nie zmieni wyników

Odpowiedz

3

Graniczna wielkość jest obliczenie zobaczyć zawartość, a masz w swoim przykładzie oczekiwanych rezultatów. Z drugiej strony layoutSize zależy od ograniczeń widoku, ponieważ nie zdefiniowałeś żadnego systemu, użyj tych domyślnych, które nie używają wewnętrznego rozmiaru. Jeśli jednak dodasz kilka ograniczeń do etykiety, tzn. Wyśrodkujesz w widoku poziomym i pionowym, system użyje wewnętrznego rozmiaru treści, aby ostatecznie określić układ, a obie wielkości będą takie same.

przykład kodu w celu 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)); 

W tym przypadku wyjścia:

2015-01-29 01:00:46.265 test[31327:911898] 
layout: {38.5, 130.5} 
intrinsicSize:{38.5, 130.5} 
Powiązane problemy