2014-08-28 29 views
5

Ho trovato un comportamento diverso del metodo systemLayoutSizeFittingSize: che mi aspettavo.systemLayoutSizeFittingSize: su UILabel non si comporta come previsto

Ecco un codice di snipped per un parco giochi rapida, che illustra il comportamento, ma la sua lo stesso in 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() 

mi sarei aspettato che layoutSize e intrinsicSize sono gli stessi.

Ma in questo caso è layoutSize(w 173, h 20) e intrinsicSize è (w 40, h 104)

mi aspetto sia per essere il intrinsicSize ma sembra systemLayoutSizeFittingSize: ignora il qualcuno preferredMaxLayoutWidth

è in grado di spiegare a me?

Edit: anche

label.setNeedsLayout() 
label.layoutIfNeeded() 

let layoutSize = label.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 

let intrinsicSize = label.intrinsicContentSize() 

non cambia i risultati

risposta

3

La dimensione intrinseca è il calcolo di vista del contenuto, e si ottiene nel tuo esempio i risultati attesi. D'altra parte layoutSize dipende dai vincoli della vista, dal momento che non hai definito alcun sistema che usa quelli di default che non usano la dimensione intrinseca. Ma se si aggiunge un paio di vincoli all'etichetta, vale a dire centrale nella vista verticalmente e orizzontalmente, il sistema utilizzerà la dimensione del contenuto intrinseco per determinare infine il layout e entrambe le dimensioni sarebbero uguali.

codice esempio nell'obiettivo-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)); 

Per questo caso l'uscita è:

2015-01-29 01:00:46.265 test[31327:911898] 
layout: {38.5, 130.5} 
intrinsicSize:{38.5, 130.5} 
Problemi correlati