2012-06-29 22 views
9

संरेखित करें मैं अपने ऐप के UILabel दृश्य में पाठ को लंबवत रूप से संरेखित करने का प्रयास कर रहा हूं। समस्या यह है कि मैं चाहता हूं कि पाठ शीर्ष पर लंबवत रूप से गठबंधन हो और लेबल का आकार 280 x 150 हो। मैं केवल इन 2 चीजों में से एक प्राप्त करने में सक्षम हूं। यदि मैंलंबवत रूप से UILabel

[myLabel sizeToFit]; 

हटा देता है तो पाठ का संरेखण ठीक है लेकिन आकार खराब हो गया है। लेकिन अगर मैं उपर्युक्त रेखा जोड़ता हूं, तो संरेखण गड़बड़ हो जाता है लेकिन आकार ठीक है। मैं इस समस्या को कैसे हल करूं।

मैं नीचे दिए गए कोड को जोड़ दिया है -

CGRect labelFrame = CGRectMake(22, 50, 280, 150); 
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame]; 
[myLabel setText:finalRecipe]; 
[myLabel setBackgroundColor: [UIColor lightGrayColor]]; 
[myLabel setNumberOfLines:0]; 
[myLabel sizeToFit]; 
[self.view addSubview:myLabel]; 
+0

संभावित डुप्लिकेट [आईओएस एप्लिकेशन के लिए यूआईएलएबल के लिए टॉप-बाएं संरेखण कैसे सेट करें?] (Http://stackoverflow.com/questions/7192088/how-to-set-top-left-alignment-for-uilable- for-ios-application) –

+0

क्या आपने फ़ॉन्ट आकार बदलने के लिए यूआईएफओटी का उपयोग करने का प्रयास किया है? – prince

+0

आपने दिए गए किसी भी उत्तर को चिह्नित क्यों नहीं किया? –

उत्तर

13

मैं FXLabel के लेखक हूँ, और जब मैं मनीष पता नहीं है, मेरा मानना ​​है कि वह मदद करने के लिए कोशिश कर रहा था (अगर वह मेरे लिए विज्ञापन कर रहा है , मैंने निश्चित रूप से उससे नहीं पूछा, और मैं उसे भुगतान नहीं कर रहा हूं - क्षमा करें मनीष!)।

FXLabel की विशेषताओं में से एक यह है कि यह इंटरफ़ेस बिल्डर में सेट के रूप में लेबल की UIContentMode प्रॉपर्टी का सम्मान करता है। इसका मतलब है कि आप label.contentMode = UIViewContentModeTop सेट कर सकते हैं; पाठ को लेबल दृश्य के शीर्ष पर संरेखित करने के लिए (जो नियमित UILabel के लिए काम नहीं करता है)। प्रासंगिक उदाहरण यहाँ है:

https://github.com/nicklockwood/FXLabel/tree/master/Examples/Text%20Alignment

FXLabel है एक ड्रॉप में UILabel के उपवर्ग, इसलिए मुझे लगता है कि प्रश्न के लिए एक बहुत अच्छा समाधान पेश किया जा रहा है।

CGRect labelFrame = CGRectMake(22, 50, 280, 150); 
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame]; 
[myLabel setText:finalRecipe]; 
[myLabel setBackgroundColor: [UIColor lightGrayColor]]; 
[myLabel setNumberOfLines:0]; 

CGFloat fontSize = 0.0f; 
labelFrame.size = [myLabel.text sizeWithFont:myLabel.font 
           minFontSize:myLabel.minimumFontSize 
          actualFontSize:&fontSize 
            forWidth:labelFrame.width 
          lineBreakMode:myLabel.lineBreakMode]; 

myLabel.frame = labelFrame; 
[self.view addSubview:myLabel]; 

नोट:: लेकिन अगर पोस्टर बल्कि एक 3 पार्टी पुस्तकालय (जो समझा जा सकता है) का उपयोग किए बिना समस्या का समाधान होगा तो यहाँ यह करने के लिए कोड है (यह अपरीक्षित है, इसलिए क्षमा याचना अगर कोई ग़लतियां नहीं हैं,)

+0

निक। डोंट वोर्री। मैं अपने प्रोजेक्ट में FXLabel का उपयोग कर रहा हूं .. और यह बहुत आसान है इसलिए मैं यहां पोस्ट करता हूं .. – Mani

11

आपको UILabel को उपclass करने की आवश्यकता होगी। इसे आज़माएं:

- (void)drawTextInRect:(CGRect)rect 
{ 
    CGSize sizeThatFits = [self sizeThatFits:rect.size]; 
    rect.size.height = MIN(rect.size.height, sizeThatFits.height); 

    [super drawTextInRect:rect]; 
} 

जैसा कि आपने पाया है, UILabel लंबवत रूप से इसकी सीमाओं के भीतर पाठ केंद्रित करता है। यहां हम पाठ ब्लॉक आकार के लिए -sizeThatFits से पूछते हैं और UILabel को पारित ड्राइंग आयत को बाधित करने के लिए इसका उपयोग करते हैं, ताकि लेबल लेबल सीमाओं के शीर्ष से खींचा जा सके।

तुम भी इस तरह नजरअंदाज कर दिया (उच्छ्वास) contentMode संपत्ति का समर्थन कर सकते हैं: Vertically align text to top within a UILabel

+0

यह एकमात्र उत्तर है जिसने मुझे यूआईएलएबल सामग्री को सही तरीके से लंबवत रूप से संरेखित करने की अनुमति दी है। काश मैं आपको कई बार वोट दे सकता हूं! –

+0

यह एकमात्र समाधान है जिसने मेरा लेबल लंबवत रूप से संरेखित करने के लिए प्राप्त किया है। धन्यवाद!!! – grabury

16

न इस के लिए UILabel का उपयोग करें:

- (void)drawTextInRect:(CGRect)rect 
{ 
    CGSize sizeThatFits = [self sizeThatFits:rect.size]; 

    if (self.contentMode == UIViewContentModeTop) { 
     rect.size.height = MIN(rect.size.height, sizeThatFits.height); 
    } 
    else if (self.contentMode == UIViewContentModeBottom) { 
     rect.origin.y = MAX(0, rect.size.height - sizeThatFits.height); 
     rect.size.height = MIN(rect.size.height, sizeThatFits.height); 
    } 

    [super drawTextInRect:rect]; 
} 

वहाँ अन्य समाधान और यहां चर्चा का एक समूह है। UIButtonUserInteractionEnabled = NO; के साथ उपयोग करें और इसमें इसके अंदर लंबवत या क्षैतिज संरेखण के विकल्प हैं।

ये रहा:

[btnDetail.titleLabel setNumberOfLines:5]; 
[btnDetail.titleLabel setLineBreakMode:NSLineBreakByCharWrapping]; 
[btnDetail setContentVerticalAlignment:UIControlContentVerticalAlignmentTop]; 
[btnDetail setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; 
[btnDetail setUserInteractionEnabled:NO]; 
btnDetail.autoresizesSubviews = YES; 
btnDetail.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
+0

मेरे लिए, पाठ अभी भी नीचे के केंद्र में संरेखित है ... मेरे पास केवल एक पंक्ति है ... इसलिए मुझे लचीली चौड़ाई और रेखाओं की संख्या को हटाना है। – jowie

1

एक तरीका उपलब्ध नहीं है उपवर्गीकरण के बिना, एक बटन का उपयोग कर या अपने खुद के रोलिंग।

लाइनों की संख्या 0 पर सेट करें, फिर आकार को टोफिट करें।

[label setNumberOfLines:0]; 
[label sizeToFit]; 

अधिक यहाँ विवरण के रूप में मुझे लगता है कि किसी और से जुड़े: Vertically align text to top within a UILabel

-2

तुम कर सकते हो इस प्रकार है .......

  1. से अपने लेबल के numberOfLines संपत्ति 0 सेट आईबी

  2. अपने लेबल का lineBreakModeUILineBreakModeWordWrap (बहुत बहुत imp ortant)

अब जो कुछ भी तुम सिर्फ लेबल पर सेट कुछ संलग्न

@ "\ n" इसे करने के लिए ..... ex.-

[yourTextLabel setText:@"myLabel\n\n\n\n\n"]; 
+0

एक हैक, लेकिन यह आसान है और यह काम करता है! –

+0

@ जेरेमीहिक्स: हाँ इसकी सरल ... –

0

मैंने किया है कि तुम क्या चाहते द्वारा

@interface UILabel (VerticalAlign) 
- (void)alignTop; 
- (void)alignBottom; 
@end 

मीटर

: एक वर्ग को लागू करने
@implementation UILabel (VerticalAlign) 

#pragma mark 
#pragma mark - Align Methods 

- (void)alignTop 
{ 
    [self setFrame:[self newLabelFrame:UIControlContentVerticalAlignmentTop]]; 
} 

- (void)alignBottom 
{ 
    [self setFrame:[self newLabelFrame:UIControlContentVerticalAlignmentBottom]]; 
} 

#pragma mark 
#pragma mark - Helper Methods 

- (CGRect)newLabelFrame:(UIControlContentVerticalAlignment)alignment 
{ 
    CGRect labelRect = self.frame; 

    NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesFontLeading; 

    CGRect textRect = [self.text boundingRectWithSize:CGSizeMake(227.f, CGFLOAT_MAX) 
               options:options 
              attributes:@{NSFontAttributeName:self.font} 
               context:nil]; 

    CGFloat textOffset = labelRect.size.height - textRect.size.height; 

    UIEdgeInsets contentInsets; 
    if (alignment == UIControlContentVerticalAlignmentTop) 
    { 
     if (textOffset < (labelRect.size.height/2.f)) 
     { 
      contentInsets = UIEdgeInsetsMake(-textOffset, 0.f, 0.f, 0.f); 
     } 
     else 
     { 
      contentInsets = UIEdgeInsetsMake(0.f, 0.f, textOffset, 0.f); 
     } 
    } 
    else 
    { 
     if (textOffset < (labelRect.size.height/2.f)) 
     { 
      contentInsets = UIEdgeInsetsMake(0.f, 0.f, -textOffset, 0.f); 
     } 
     else 
     { 
      contentInsets = UIEdgeInsetsMake(textOffset, 0.f, 0.f, 0.f); 
     } 
    } 

    return UIEdgeInsetsInsetRect(labelRect, contentInsets); 
} 

@end 

याद रखें कि आपको "नंबरऑफलाइन" को 0 पर सेट करने की आवश्यकता है। यह उदाहरण मल्टीलाइन विकल्पों के साथ काम करता है!

आप श्रेणी से ऊपर लागू करने के बाद, आप बस कर सकते हैं:

[myLabel setText:finalRecipe]; 
[myLabel alignTop]; 

चीयर्स!

8

स्विफ्ट में, उपवर्गीकरण UILabel, drawTextInRect अधिभावी और UIViewContentMode के अनुरूप की JRC के समाधान इस प्रकार दिखाई देगा:

class AlignableUILabel: UILabel { 

    override func drawText(in rect: CGRect) { 

     var newRect = CGRect(x: rect.origin.x,y: rect.origin.y,width: rect.width, height: rect.height) 
     let fittingSize = sizeThatFits(rect.size) 

     if contentMode == UIViewContentMode.top { 
      newRect.size.height = min(newRect.size.height, fittingSize.height) 
     } else if contentMode == UIViewContentMode.bottom { 
      newRect.origin.y = max(0, newRect.size.height - fittingSize.height) 
     } 

     super.drawText(in: newRect) 
    } 

} 

कार्यान्वयन बस की बात है:

yourLabel.contentMode = UIViewContentMode.top 

मेरे लिए, यह काम किया जादू की तरह।

+0

नोट: @rsc ने इसे 9 जुलाई, 2017 को स्विफ्ट 3.1 में अपडेट किया – Roshambo

1

आप इसे इंटरफ़ेस बिल्डर पर बाधा के साथ बना सकते हैं।

  1. 3 लाइनों के लिए और संबंध खंड में बड़ा डाल "के बराबर या उससे कम" लाइनों है कि आप चाहते हैं
  2. पर्याप्त एक ऊंचाई के साथ एक बाधा बना की संख्या रखो।

आशा है कि यह आपकी मदद करेगा!

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