2012-03-28 16 views
15

मुझे UILabels में टेक्स्ट की बेसलाइन को संरेखित करने की आवश्यकता है। मैं वर्तमान में जो कर रहा हूं वह है कि मैं टेक्स्ट युक्त यूआईएलएबल्स की बेसलाइनों को संरेखित कर रहा हूं, और जब टेक्स्ट लेबल का आकार दो लेबलों में अलग होता है, तो इसके परिणामस्वरूप यूलाबेल बेसलाइन को गठबंधन किया जाता है लेकिन टेक्स्ट बेसलाइन को गलत तरीके से गलत किया जाता है (एक छोटे मार्जिन द्वारा गलत तरीके से हस्ताक्षर किया जाता है, लेकिन फिर भी गलत संरेखित)। लेबल कस्टम UIView उपclass में शामिल हैं, इसलिए self शामिल UIView को संदर्भित करता है।आईआईएलएबल्स में टेक्स्ट के बेसलाइन को आईओएस पर विभिन्न फ़ॉन्ट आकारों के साथ कैसे संरेखित करें?

यहाँ प्रासंगिक कोड

[self.mySmallLabel sizeToFit]; 
[self.myBigLabel sizeToFit]; 

self.mySmallLabel.frame = CGRectMake(0,  
            self.bounds.size.height - self.mySmallLabel.bounds.size.height, 
            self.mySmallLabel.bounds.size.width, 
            self.mySmallLabel.bounds.size.height); 

self.myBigLabel.frame = CGRectMake(self.mySmallLabel.frame.origin.x + self.mySmallLabel.bounds.size.width, 
            self.bounds.size.height - self.myBigLabel.bounds.size.height, 
            self.myBigLabel.bounds.size.width, 
            self.myBigLabel.bounds.size.height); 
[self.mySmallLabel sizeToFit]; 
[self.myBigLabel sizeToFit]; 

छवि नीचे लिंक में aligment में इस कोड को परिणाम है।

Misalignemnt

आप देख सकते हैं, भले ही UILabel आधार रेखा गठबंधन कर रहे हैं, पाठ के आधार रेखा एक छोटे अंतर से गलत संरेखित है। मैं गतिशील रूप से टेक्स्ट की बेसलाइन कैसे संरेखित कर सकता हूं (क्योंकि रनटाइम पर फ़ॉन्ट आकार बदल सकते हैं)?

उत्तर

25

मैं विभिन्न स्थानों के एक जोड़े में this answer उपयोग कर रहा था, लेकिन आधार रेखा कभी कभी रेटिना प्रदर्शित करता है पर एक पिक्सेल से दूर रहे थे। नीचे दिए गए स्निपेट स्क्रीन के पैमाने के लिए खातों:

[majorLabel sizeToFit]; 
[minorLabel sizeToFit]; 

CGRect changedFrame = minorLabel.frame; 
changedFrame.origin.x = CGRectGetWidth(majorLabel.frame); 

const CGFloat scale = [UIScreen mainScreen].scale; 
const CGFloat majorLabelBaselineInSuperView = CGRectGetMaxY(majorLabel.frame) + majorLabel.font.descender; 
const CGFloat minorLabelBaselineInOwnView = CGRectGetHeight(minorLabel.frame) + minorLabel.font.descender; 
changedFrame.origin.y = ceil((majorLabelBaselineInSuperView - minorLabelBaselineInOwnView) * scale)/scale; 

minorLabel.frame = changedFrame; 
+4

कोई भी संस्करण जो ऑटो लेआउट का उपयोग करता है? – adib

+9

ऑटो लेआउट संस्करण आसान है: आप जो भी जा रहे हैं उसके आधार पर, 'NSLayoutAttributeBaseline' (या 'NSLayoutAttributeLastBaseline' या' NSLayoutAttributeFirstBaseline' द्वारा दो लेबल को संरेखित करें)। –

3

मैं इसे स्वयं करने के लिए देख रहा था (अभी अभी) और almost identical question पर मेरा उत्तर मिला। हालांकि यह आसान समाधान नहीं है, हमें गणित करना है।

मुझे केवल 2 अलग-अलग लेबलों के साथ ऐसा करने की आवश्यकता है और मैं इसे UIView के उप-वर्ग में कर रहा हूं।

- (void)layoutSubviews { 
    [majorLabel sizeToFit]; 
    [minorLabel sizeToFit]; 

    CGRect changedFrame = minorLabel.frame; 
    changedFrame.origin.x = majorLabel.frame.size.width; 
    changedFrame.origin.y = (majorLabel.frame.size.height + majorLabel.font.descender) - (minorLabel.frame.size.height + minorLabel.font.descender); 
    minorLabel.frame = changedFrame; 
} 
8

तुम एक साधारण गणना में UIFont आरोहक मूल्य का उपयोग करके UILabels के किसी भी जोड़ी के लिए पिक्सेल सही आधारभूत संरेखण मिल सकती है।

[majorLabel sizeToFit]; 
[minorLabel sizeToFit]; 

CGRect changedFrame = minorLabel.frame; 
changedFrame.origin.y = ceilf(majorLabel.frame.origin.y + (majorLabel.font.ascender - minorLabel.font.ascender)); 
minorLabel.frame = changedFrame; 

ceilf() प्रयोग किया जाता है क्योंकि font.ascender मूल्यों आंशिक हो सकता है: यहाँ कैसे।

मैंने उत्कृष्ट परिणामों के साथ रेटिना और गैर-रेटिना उपकरणों दोनों पर इसका परीक्षण किया है। एक्स-अक्ष पर एक-दूसरे के सापेक्ष दो लेबलों को पोजिशन करना छोड़ दिया गया है, क्योंकि आपकी ज़रूरतें अलग-अलग हो सकती हैं। यदि आपको यूआईएफओटी आरोही (और अन्य यूआईएफओटी जानकारी) के बारे में त्वरित स्पष्टीकरण की आवश्यकता है, तो यह स्पष्ट, संक्षिप्त article देखें।

+0

मैंने यह कोशिश की है, लेकिन, आईओएस 5 ascender और descender पर मेरे परीक्षण में दोनों 0 हैं –

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