2012-12-01 39 views
18

UILabel standardını alıp dikey alanı doldurması için yazı tipi boyutunu arttırmak istiyorum.Yazı tipi boyutunu dikey olarak sığacak şekilde ölçekleme UILabel

- (void)drawRect:(CGRect)rect 
{ 
    // Size required to render string 
    CGSize size = [self.text sizeWithFont:self.font]; 

    // For current font point size, calculate points per pixel 
    float pointsPerPixel = size.height/self.font.pointSize; 

    // Scale up point size for the height of the label 
    float desiredPointSize = rect.size.height * pointsPerPixel; 

    // Create and assign new UIFont with desired point Size 
    UIFont *newFont = [UIFont fontWithName:self.font.fontName size:desiredPointSize]; 
    self.font = newFont; 

    // Call super 
    [super drawRect:rect]; 
} 

Ama etiketin alt ötesine yazı ölçekler olarak bu işe yaramazsa: Bu question için kabul edilen yanıt ilham alan bu drawRect uygulamasıyla UILabel bir alt sınıfı tanımlanmıştır. Bunu çoğaltmak isterseniz, 289x122 (w x h), Helvetica yazı tipi ve 60 etiketli bir başlangıç ​​noktası ile etiket içinde rahatça oturan bir etiketle başladım.

uilabel

uilabel subclass

Ben, yazı tipi kuyruklu ve ascenders baktım dikkate bunlardan yola çıkarak ölçeklendirme çalıştı: Burada dize "{Hg" kullanarak standart UILabel ve benim alt sınıf örnek çıkışı farklı kombinasyonlar, ama hala hiç şans yoktu. Herhangi bir fikir, bu farklı descender ve ascender uzunlukları olan farklı yazı tipleri ile ilgisi var mı?

cevap

12

pointsPerPixel İçin hesaplama olması gerektiği, yanlış yol kalmıştır ...

float pointsPerPixel = self.font.pointSize/size.height; 
Ayrıca

, belki bu kod yazı değiştirilmelidir tek süre olarak layoutSubviews olması gerekirken çerçeve boyutu değişir.

+1

iyi ... bu utanç verici bir şekilde basit bir hataydı. Onu gördüğünüz için teşekkürler. – user524261

+0

Bunu "layoutSubviews" uygulamasında denedim, ancak işe yaradığını düşünmüyorum. Bunun sebebi, "UILabel" alt sınıfına yeni bir fontun atanmasının, sorun olan "layoutSubviews" ın başka bir çağrısını tetiklemesi olduğunu düşünüyorum. Uygulamamda, uygulamamın kuyruğundan biri kilitlendi. – user444731

0

Bir sonraki büyük yazı tipi boyutuna ulaşan bir yuvarlama hatası olup olmadığını merak ediyorum. Rec.size.height'ı biraz ölçeklendirebilir misiniz?

float desiredPointSize = rect.size.height *.90 * pointsPerPixel; 

Güncelleme: Böyle bir şey Kişisel pointPerPixel hesaplama ters. Pikselleri nokta pikselleri yerine noktalara göre bölüyorsunuz. Bunları değiştir ve her seferinde çalışır.

//text to render  
NSString *soString = [NSString stringWithFormat:@"{Hg"]; 
UIFont *soFont = [UIFont fontWithName:@"Helvetica" size:12]; 

//box to render in 
CGRect rect = soLabel.frame; 

//calculate number of pixels used vertically for a given point size. 
//We assume that pixel-to-point ratio remains constant. 
CGSize size = [soString sizeWithFont:soFont]; 
float pointsPerPixel; 
pointsPerPixel = soFont.pointSize/size.height; //this calc works 
//pointsPerPixel = size.height/soFont.pointSize; //this calc does not work 

//now calc which fontsize fits in the label 
float desiredPointSize = rect.size.height * pointsPerPixel; 
UIFont *newFont = [UIFont fontWithName:@"Helvetica" size:desiredPointSize]; 

//and update the display 
[soLabel setFont:newFont]; 
soLabel.text = soString; 

ölçekli ve 40pt gelen 60pt yazı arasında değişen, ben test her boyut için etiket kutunun içine sığacak: Sadece hassaslık için, burada ben test örnek kod var. Hesaplamayı tersine çevirdiğimde, aynı sonuçları kutu için çok uzun yazı tipiyle gördüm.

+0

Tamsayılar için yuvarlama yok çünkü float pointSize değerlerini kullanıyoruz. Öyle olsa bile, fontSize bir noktadan daha fazlası tarafından dışarıda. Bir faktör tarafından geri ölçeklendirilebileceğini kabul ettiniz, ancak bu tam bir hesaplamadan daha fazla bir şekerleme ve yazı tipine göre değişir. – user524261

İlgili konular