2013-08-15 8 views
27

कैसे UILabel को नीचे से गठबंधन किया जा सकता है। मान लें, मेरा लेबल टेक्स्ट की तीन पंक्ति रख सकता है। अगर इनपुट टेक्स्ट सिंगल लाइन है, तो यह लाइन लेबल के नीचे आनी चाहिए। कृपया बेहतर समझ के लिए नीचे दी गई छवि देखें। नारंगी क्षेत्र लेबल का पूरा फ्रेम है। वर्तमान में इसमें एक रेखा है और यह गठबंधन केंद्र है। तो मैं क्या चाहता हूं, यह कितनी लाइनों के बावजूद हमेशा गठबंधन होना चाहिए।नीचे से UILabel पाठ को संरेखित कैसे करें?

enter image description here

अपने विचारों को सुझाव दें।

धन्यवाद।

उत्तर

20

यहाँ कि करने के दो तरीके हैं ...

1. पहले 0 करने के लिए numberOfLines सेट करें और फिर अपने contentSize साथ UILabel तो अपने UILabel प्रदर्शन के sizeToFit संपत्ति का उपयोग करें।

yourLabel.numberOfLines = 0; 

[yourLabel sizeToFit]; 

इस लिंक से अधिक जानकारी देखें: Vertically align text within a UILabel

2. एक अन्य विकल्प है UILabel के बजाय UITextField लेने के लिए और NO नीचे की तरह करने के लिए userInteractionEnabled सेट करने के लिए ...

[yourTextField setUserInteractionEnabled:NO]; 

और फिर नीचे contentVerticalAlignment संपत्ति को नीचे की तरह सेट करें ....

[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom]; 

अद्यतन

इसके अलावा, UITextField के साथ, हम कई पंक्तियों को प्राप्त नहीं कर सकता। तो इसके बजाय हम UITextView का उपयोग कर सकते हैं और userInteractionEnabled को NO पर सेट कर सकते हैं। फिर, इसे नीचे गठबंधन करने के लिए नीचे दिए गए कोड का उपयोग करें।

CGFloat topCorrect = ([label bounds].size.height - [label contentSize].height); 
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect); 
label.contentOffset = (CGPoint){.x = 0, .y = -topCorrect}; 
+0

मैंने पहले ही समाधान का प्रयास किया है। लेकिन यह ठीक से काम नहीं कर रहा है। यह हमेशा ऊपर और बाएं में गठबंधन होता है। लेकिन इसे हमेशा नीचे और केंद्र पर गठबंधन किया जाना चाहिए। लेकिन दूसरा समाधान काम करता प्रतीत होता है। दूसरे समाधान में एकाधिक लाइन के बारे में क्या? क्या यह संभव होगा? – NSUserDefault

+0

मान लीजिए कि यह फ्रेम 3 लाइन के साथ है 'सीजीआरईटीमेक (10,100,100,300);' फिर यदि आपको केवल एक पंक्ति मिलती है तो उस फ्रेम को सेट करें 'सीजीआरईटीमेक (10,260,100,300);', यहां तर्क के साथ कुछ कस्टम कोड सेट करें ** अन्यथा ** दूसरा विकल्प सबसे अच्छा है :) –

+0

हां दूसरा सबसे अच्छा है। मैं कोशिश करूँगा और आपको बता दूंगा। – NSUserDefault

0

आप UILabel उपवर्ग और विधि अधिभावी कर सकते हैं:

- (void)drawTextInRect:(CGRect)rect 

रेक्ट जहां आप उपयोग करना चाहते के साथ कॉल सुपर drawTextInRect

+0

आप भी उपयोग कर सकते हैं - (सीजीईजीईटी) टेक्स्ट रेक्टफोरबाउंड्स: (सीजीआरईटी) सीमाएं सीमित नहीं हैंऑनलाइनऑफलाइन: (एनएसआईएनटेगर) संख्याऑफलाइन; जो अधिक स्पष्ट हो सकता है। – Dustin

15

उपवर्ग UILabel

@interface Label : UILabel 

@end 

तब तो

@implementation Label 

- (void)drawTextInRect:(CGRect)rect 
{ 
    if(alignment == top) { 

     rect.size.height = [self sizeThatFits:rect.size].height; 
    } 

    if(alignment == bottom) { 

     CGFloat height = [self sizeThatFits:rect.size].height; 

     rect.origin.y += rect.size.height - height; 
     rect.size.height = height; 
    } 

    [super drawTextInRect:rect]; 
} 

@end 
+0

यह वास्तव में मेरे लिए पूरी तरह से काम करता है, लगभग कोई प्रयास नहीं, और यह यहां कुछ अन्य समाधानों की तरह हैकी महसूस नहीं करता है। –

0

मैं एक ही मुद्दा था की तरह drawTextInRect ओवरराइड।

- (void)alignLabel:(UILabel *)l withText:(NSString *)text verticalAlignOption:(int)vertAlign{ 
CGSize stringSize = [text sizeWithFont:l.font constrainedToSize:l.frame.size lineBreakMode:l.lineBreakMode]; 

switch (vertAlign) { 
    case 0: // align = top 
     l.frame = CGRectMake(l.frame.origin.x, 
            l.frame.origin.y, 
            l.frame.size.width, 
            stringSize.height 
            ); 
     break; 
    case 1: // align = bottom 
     l.frame = CGRectMake(l.frame.origin.x, 
            (l.frame.origin.y + l.frame.size.height) - stringSize.height, 
            l.frame.size.width, 
            stringSize.height 
            ); 
     break; 
    case 2: // align = middle 
     // default 
     break; 
} 

l.text = text; 
} 

Ahd आप साधारण इस तरह विधि कॉल नीचे करने के लिए संरेखित करने के लिए:

[self alignLabel:self.mediaTitle withText:@"My text to align" verticalAlignOption:1]; 
0

एक अन्य विकल्प: एक लेबल का उपयोग यहाँ कैसे मैं अपने UILabel की तह तक पाठ संरेखित करने के लिए बनाया है आपके पृष्ठभूमि रंग के लिए, मैं इसे एक मूल लेबल कहता हूं, और पाठ के लिए दूसरा, जिसे मेरे उदाहरण में टेक्स्ट लेबल कहा जाता है। तब ऊंचाई की गणना और वाई पाठलेबल के लिए समन्वय:

[textLabel sizeToFit]; 
int height = textLabel.frame.size.height; 
int yCoord = originalLabel.frame.origin.y + 
      originalLabel.frame.size.height - height; 
textLabel.frame = CGRectMake(originalLabel.frame.origin.x, yCoord, 
      textLabel.frame.size.width, height); 
2

मैं केवल जो एक अधिकतम बाधा के लिए कोड है और यह भी लाइन्स की संख्या का उपयोग किए बिना मेरे लिए काम करता आईबी में सुपर देखने के लिए एक निचले स्थिर निर्धारित किया है।

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