2012-01-26 9 views
10

मैं UIView पर लेआउट टेक्स्ट की कोशिश कर रहा हूं।आईओएस - एक पत्र की "असली" ऊंचाई प्राप्त करें

(पीला क्षेत्र पृष्ठभूमि रंग के साथ UILabel का फ्रेम है)।

जब मैं sizeWithFont का उपयोग मैं इस मिलता है, जो पत्र ऊपर एक बहुत बड़ी जगह है:

p with sizeWithFont

जब मैं font.pointSize का उपयोग मैं "मैं" जो अच्छे है के लिए इस मिल

p with font.pointSize

लेकिन जब मैं "पी" के लिए इसका इस्तेमाल करते हैं मैं सटीक ऊंचाई मिलता है लेकिन पत्र बो में तैयार की है ttom और फसल।

p with font.pointSize

** कैसे मैं ग्लिफ़ केवल फ्रेम में केंद्रित मिल मिल सकता है? **

धन्यवाद

शनि

उत्तर

18

वहाँ UIFont पर गुण का एक बहुत इस स्थिति में मदद करने के लिए कर रहे हैं:

  • pointSize
  • ascender
  • descender
  • capHeight
  • xHeight
  • lineHeight
+2

एक तस्वीर रखना अच्छा लगेगा, इसलिए यह स्पष्ट है कि वे सभी को किस प्रकार परिभाषित किया गया है। उदाहरण के लिए, pointSize == ascender + descender करता है और ascender> = capHeight है? – Matt

+4

@ मैट, यह एक पुराना है, लेकिन मुझे https://www.cocoanetics.com/2010/02/understanding-uifont/ पर बहुत उपयोगी जानकारी मिलती है। – Roy

3

आप (उदाहरण के लिए के साथ: How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?) समारोह की एक "printscreen" प्रकार के साथ एक UIImage को UILabel परिवर्तित कर सकते हैं और फिर एक के बाद पिक्सल एक की जाँच करें और ' बाएं शीर्ष एन दाएं नीचे की गणना करें।

+0

यह निश्चित रूप से एक UIImage, जवाब द्वारा जेफ केली बेहतर है प्रदान की के लिए एक लेबल परिवर्तित करने के लिए आवश्यक नहीं है:

निम्नलिखित कोड नमूना गणना मैं इस्तेमाल किया बताते हैं। ऐसे कई गुण हैं जो UILabel –

+1

की सटीक ऊंचाई को परिभाषित करने में आपकी सहायता कर सकते हैं, मैं असहमत हूं। कुछ फोंट के लिए ऊंचाई प्रति पूंजी (capHeight) प्रति चरित्र अलग है (http://bit.ly/OtdxOe देखें)। 'यूआईएफओटीटी' वर्ग की अन्य @ प्रॉपर्टीज में समान समस्याएं हैं। फ्लैश/एएस 3 में कुछ विकसित करते समय मुझे एक ही समस्या आई है। "पिक्सल गिनती" ने अंत में मेरे लिए यह किया। – basvk

2

टेक्स्ट को ऊपर से ऊपर ले जाने का प्रयास करें font.ascender - font.capHeight। UILabel की ऊंचाई को कम करने से इसकी सामग्री क्लिप हो सकती है, इसलिए आकार बदलने के बजाय लेबल की वाई स्थिति को समायोजित करना बेहतर होता है।

// in UILabel subclass: 
- (CGFloat) topPadding 
{ 
    // ascender = height from baseline to top of label (including top padding) 
    // capHeight = height of a capital letter = ascender - top padding 
    // -> top padding = ascender - capHeight 
    return self.font.ascender - self.font.capHeight; 
} 
संबंधित मुद्दे