2012-12-01 15 views
18

में लंबवत फिट करने के लिए फ़ॉन्ट आकार स्केलिंग मैं मानक UILabel लेना चाहता हूं और फ़ॉन्ट आकार को बढ़ा सकता हूं ताकि यह लंबवत स्थान भर सके। इस question के लिए स्वीकार किए जाते हैं जवाब से प्रेरणा ले रहा है, मैं इस drawRect कार्यान्वयन के साथ UILabel पर एक उपवर्ग परिभाषित: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]; 
} 

लेकिन के रूप में यह लेबल के नीचे से बाहर फ़ॉन्ट मापता है यह काम नहीं करता। यदि आप इसे दोहराना चाहते हैं, तो मैंने लेबल 28 9 x122 (डब्ल्यू एक्स एच), हेल्वेटिका को फ़ॉन्ट के रूप में शुरू किया और 60 का प्रारंभिक बिंदु लेबल में आराम से फिट बैठता है।

uilabel

uilabel subclass

मैं, फ़ॉन्ट descenders और आरोहक देखा है स्केलिंग की कोशिश की में ध्यान में इन लेने: यहाँ मानक UILabel और मेरे उपवर्ग से उदाहरण उत्पादन स्ट्रिंग "{एचजी" उपयोग कर रहा है विभिन्न संयोजन, लेकिन अभी भी कोई भाग्य नहीं है। कोई विचार, क्या अलग-अलग फोंट के साथ ऐसा करने के लिए कुछ अलग-अलग अवरोधक और आरोही लंबाई है?

उत्तर

12

pointsPerPixel के लिए आपका गणना, गलत तरीके से निर्भर है यह होना चाहिए ...

float pointsPerPixel = self.font.pointSize/size.height; 

इसके अलावा, हो सकता है इस कोड को केवल समय के रूप में फ़ॉन्ट को बदला जाना चाहिए layoutSubviews में होना चाहिए जब फ्रेम आकार है परिवर्तन।

+1

अच्छी तरह से ... यह एक शर्मनाक सरल गलती थी। इसे तलाशने के लिए धन्यवाद। – user524261

+0

मैंने इसे 'लेआउट सबव्यूव्स 'में लागू करने का प्रयास किया, लेकिन मुझे नहीं लगता कि यह काम करता है। मुझे लगता है कि कारण यह है कि 'उइलाबेल' उप-वर्ग में एक नया फ़ॉन्ट असाइन करने से 'लेआउट सबव्यूव्स 'का एक और आमंत्रण ट्रिगर होता है, जो समस्याग्रस्त है। मेरे कार्यान्वयन में, मेरे ऐप की कतारों में से एक लॉक हो गया। – user444731

0

मुझे आश्चर्य है कि क्या यह एक बड़ा गोल आकार अगले बड़े फ़ॉन्ट आकार तक पहुंच रहा है। क्या आप बस rec.size.height थोड़ा पैमाने पर स्केल कर सकते हैं?

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

अपडेट:: की तरह कुछ आपका pointPerPixel गणना पीछे की ओर है। आप वास्तव में पिक्सेल द्वारा अंक के बजाय फ़ॉन्ट पॉइंट्स द्वारा पिक्सेल को विभाजित कर रहे हैं। उनको स्वैप करें और यह हर बार काम करता है।

//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; 

कि छोटा और हर आकार मैं परीक्षण किया के लिए लेबल बॉक्स के अंदर फिट, 40pt से 60pt फोंट को लेकर: बस पूर्णता के लिए, यहाँ मैं परीक्षण किया नमूना कोड है। जब मैंने गणना को उलट दिया, तो मैंने बॉक्स के लिए बहुत लंबा फ़ॉन्ट के साथ एक ही परिणाम देखा।

+0

पूर्णांक के लिए कोई गोल नहीं है क्योंकि हम फ्लोट पॉइंट आकार मान का उपयोग कर रहे हैं। फिर भी, फ़ॉन्ट आकार एक पूरे बिंदु आकार से अधिक है। इस बात से सहमत है कि आप एक कारक से पीछे हट सकते हैं, लेकिन यह सटीक गणना से अधिक झगड़ा है और फ़ॉन्ट द्वारा भिन्न होता है। – user524261

 संबंधित मुद्दे