2011-01-11 43 views
7

Boyut için bir kenar durumu buldum düşünüyorumWithFont: constrainedToSize: Burada, retina ekranında, bazen (sözcük kaydırma temelli) bir yükseklik 1 satırı döndürür aslında daha büyüktür, ve daha önemlisi aslında çizer.NSString sizeWithFont: constrainedToSize: retina ekranlarında yanlış yükseklik geri dönüyor

NOT: Kullandığım gerçek kod, performans merkezli elle çizilmiş değişken yükseklikli tablo görünümü hücre kodunun içine gömüldü, bu yüzden sorunu olabildiğince basit bir örnek kodla ayırdım. (Lütfen bu soruya başka bir soruya cevap vermeye çalıştığınızda dikkat edin :-)

Bu örnekte UIView içeriği doldurur, metni sığdırır (sarılır), bu dolguyu doldurur, sonra metni çizer.

Bir retina aygıtında (veya simülatörde) yükseklik 1 satır çok uzun, ancak bir retina öncesi aygıtta (veya simülatörde) döndürülürse, doğru yüksekliği döndürür.

Düzeltmek istediğim bir hata olduğundan, herkesin sahip olabileceği herhangi bir kavrayışı takdir ediyorum!

Çok teşekkürler!

-Eric

- (void)drawRect:(CGRect)rect { 
NSString * theString = @"Lorem ipsum dolor sit ameyyet, consectetur adipiscing elit. Etiam vel justo leo. Curabitur porta, elit vel."; 
UIFont * theFont = [UIFont systemFontOfSize:12]; 
CGSize theConstraint = CGSizeMake(rect.size.width - 20, rect.size.height - 20); 
CGSize theResultSize = [theString sizeWithFont:theFont constrainedToSize:theConstraint]; 

// dump the measurements 
NSLog(@"returned a size h = %f, w = %f", theResultSize.height, theResultSize.width); 

// fill the whole rect 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[[UIColor yellowColor] set]; 
CGContextFillRect(context, rect); 

// fill the measured rect 
CGRect theRect = CGRectMake(10, 10, theResultSize.width, theResultSize.height); 
context = UIGraphicsGetCurrentContext(); 
[[UIColor cyanColor] set]; 
CGContextFillRect(context, theRect); 

// draw the text 
[[UIColor blackColor] set]; 
[theString drawInRect:theRect withFont:theFont]; 
} 

bütün basit proje here mevcuttur.

Simülatörü Görüntüler:
http://files.droplr.com/files/9979822/aLDJ.Screen%20shot%202011-01-11%20at%2012%3A34%3A34.png http://files.droplr.com/files/9979822/YpCM.Screen%20shot%202011-01-11%20at%2012%3A36%3A47.png

+0

Zor bir o bitince ne var? Birisi yardım edebilir mi? Tumbleweed rozeti kazanmak için süper eğlenceli değildi! – eric

+2

Örnek projenizi yürüttükten sonra, bunun bir simülatör veya SDK'nın hatası olduğuna inanıyorum, evet, Xcode 4'te iOS 4.3 ile ilgili bir sorunu yok. – cxa

+0

Teşekkürler xan. Şu anki Xcode/iOS – eric

cevap

2

düzgün çalışır. Bu haklı, OS üzerinde bir Retina simülatör ile 4.3.2

enter image description here

+0

Ona baktığınız için teşekkür ederiz. Bunu tetiklemem gerekecek ve hala mevcut işletim sistemlerinde bunu yapıp yapmadığını göreceğim. – eric

+1

Doğru, yeni OS/Xcode'da düzeltildi. Örneklemi çalıştırdığım için +1, bana metnin nasıl ölçüleceğini söyleyeceğim ;-) teşekkürler Sum! – eric

+0

İyi .. Sadece iOS8'de aynı hata gösterisine girdim ... Buna tekrar dikkat etmeye başlama zamanı. Bu sefer CİHAZ AÇIK oluyor! – eric

1

ardından ben dinamik metin içerik için etiketin yüksekliğini bulmak için kullandıkları bir yöntemdir. Bu benim app sizin simülatör ile ilgili bir sorun gibi görünüyor

 
 
- (float)getHeightFortheDynamicLabel:(NSString *)stringForTheLabel 
{ 
    UITextView *aSampleTextView; 
    // 30 is the minimum height 
    aSampleTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, mywidth, 30)]; 
    aSampleTextView.text = stringForTheLabel; 
    aSampleTextView.font = [UIFont systemFontOfSize:kMyFontSize]; 
    aSampleTextView.alpha = 0; 
    [self.view addSubview:aSampleTextView]; 
    float textViewHeight = aSampleTextView.contentSize.height; 
    [aSampleTextView removeFromSuperview]; 
    [aSampleTextView release]; 
    return textViewHeight;
}

+0

İlginç bir fikir ... olduğu kadar pahalı ... Bir yıl sonra taze bir görünüm almalıyım ... :-) – eric

+0

Bu yöntemi kullanmadan önce denedim (CGSize theResultSize = [theString sizeWithFont : theFont kısıtlıToSize: TheConstraint]; ) Ama o kadar doğru değildi (nedenini bilmiyorum). Bu yöntem az miktarda bellek kullanımı tüketse de, benim için iyi çalışıyor. –

0
 NSString *strSubstring = @"asdfghjklasdfghjkl adsds"; 

     CGFloat maxWidth = 205.0; 
     CGFloat maxHeight = 9999; 
     CGSize maximumLabelSize = CGSizeMake(maxWidth,maxHeight); 
     CGSize expectedLabelSize = [strSubstring sizeWithFont:[UIFont fontWithName:@"StagSans-Light" size:12] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; 

     NSLog(@"returned a size h = %f, w = %f", expectedLabelSize.height, expectedLabelSize.width); 

     return expectedLabelSize; 
İlgili konular