2011-08-05 24 views
11

NSString'im var ve uygun bir UILabel oluşturmak için yüksekliğini bilmek istiyorum. BuNSString yüksekliğini edinin

NSString *string = @"this is an example"; 
CGSize size = [string sizeWithFont:[UIFont systemFontOfSize:10.0f] 
          forWidth:353.0 
        lineBreakMode:UILineBreakModeWordWrap]; 
float height = size.height; 

yüksekliği yapmak

şimdi 13.0 olduğunu. Bu dize

NSString *string = @"this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example this is an example this is an example 
        this is an example "; 

yüksekliği (bu imkansız, genişliği olarak ve birlikte 353) her zaman 13.0 olduğunu kullanırsanız ... ne yanlış yapıyorum?

ADD: Bu lineBreakMode doğru değilse gibi öyle çok

size.width; 

... iyi çalışıyor ... ama buna değil mi?

+0

hangi. Nesne, yeni oluşturduğunuz CGSize değil. Bu bir yazım hatası mı? –

+0

ancak "sizeWithFont: forWidth: lineBreakMode" bir NSString'i (örneğin bir UILabel değil) alır ... bu yüzden doğru mu ... değil mi? – JAA

+0

Bunu almaz, söyler, üzerinde hareket eder ve size bir boyut verir. Yani eğer float yüksekliğini = string.height; 'float height = size değiştirecekseniz.yükseklik; ', sanırım daha mantıklı olacak. –

cevap

21

-sizeWithFont:constrainedToSize:lineBreakMode: 

için ise

– sizeWithFont:forWidth:lineBreakMode: 

"Metin Tek Hat için Bilgi İşlem Metrikleriyle" için olduğu için beklediğiniz gibi çalışmıyor yapıyoruz nedenidir "Metnin Çoklu Çizgileri için Hesaplama Metrikleri". documentation Gönderen: Metin Tek Hat için

Bilgisayar Metrikleriyle

– sizeWithFont: 
– sizeWithFont:forWidth:lineBreakMode: 
– sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: 

Bilgisayar Ölçümleri Metin Çoklu Hatları için

– sizeWithFont:constrainedToSize: 
– sizeWithFont:constrainedToSize:lineBreakMode: 

yerine örneğin -sizeWithFont:constrainedToSize:lineBreakMode: kullanmayı deneyin

CGSize maximumLabelSize = CGSizeMake(353,9999); 

CGSize expectedLabelSize = [string sizeWithFont:label.font       
           constrainedToSize:maximumLabelSize 
            lineBreakMode:label.lineBreakMode]; 

CGRect newFrame = label.frame; 
newFrame.size.height = expectedLabelSize.height; 
label.frame = newFrame; 
+0

Üzgünüm, yanlış yazdım (şimdi düzeltdim)! Tabii ki, Xcode'da doğruydu (ve günlük 13.0) – JAA

+0

EVET! Bu çalışıyor! teşekkür ederim!!! – JAA

+0

Bu, tek bir yöntemle yapılabilecek bir şey için çok fazla kod. Ve bir downvote aldım, lol. –

1

Bu yöntem belirtilen genişliği kısıtlı dize genişliğini ve yüksekliğini döndürür Documentation

göre: Bu genellikle ne olduğunu. Satır sonlarının olmasını hesaplamasına rağmen, bu yöntem metni ek olarak satırlarına sarmaz. Dizenin boyutu verilen genişliği aşıyorsa, bu yöntem metnini keser (yalnızca düzenleme amacıyla), belirtilen genişlik çizgisine uygun olana kadar belirtilen satır kesme modunu kullanarak; daha sonra ortaya çıkan kesik dizgenin boyutu döndürür.

Kullanılacak should - [NSString sizeWithFont: constrainedToSize: lineBreakMode:] benzer davranışa sahip ancak geçirilen boyutunda yükseklik olarak CGFLOAT_MAX uuse edebilirsiniz Sen dize ilgili boyutu alıyorsun