ios UILabel के भीतर टेक्स्ट को लंबवत रूप से संरेखित करें




cocoa-touch uikit (24)

किसी को भी इसे पढ़ने के लिए क्योंकि आपके लेबल के अंदर का पाठ लंबवत केंद्रित नहीं है, ध्यान रखें कि कुछ फ़ॉन्ट प्रकार समान रूप से डिज़ाइन नहीं किए गए हैं। उदाहरण के लिए, यदि आप ज़ैपफिनो आकार 16 के साथ एक लेबल बनाते हैं, तो आप देखेंगे कि पाठ लंबवत रूप से केंद्रित नहीं है।

हालांकि, हेल्वैटिका के साथ काम करने से लंबवत आपके पाठ को केंद्रित किया जाएगा।

मेरे पास टेक्स्ट की दो पंक्तियों के लिए एक UILabel । कभी-कभी, जब पाठ बहुत छोटा होता है, तो यह पाठ लेबल के ऊर्ध्वाधर केंद्र में प्रदर्शित होता है।

मैं UILabel के शीर्ष पर हमेशा टेक्स्ट को लंबवत कैसे संरेखित करूं?


कोड को पढ़ने के लिए थोड़ी देर लग गई, साथ ही साथ प्रस्तुत पृष्ठ में कोड, और पाया कि वे सभी लेबल के फ्रेम आकार को संशोधित करने का प्रयास करते हैं, ताकि डिफ़ॉल्ट केंद्र वर्टिकल संरेखण प्रकट न हो।

हालांकि, कुछ मामलों में हम चाहते हैं कि लेबल उन सभी रिक्त स्थान पर कब्जा कर ले, भले ही लेबल में इतना टेक्स्ट हो (उदाहरण के लिए समान पंक्ति वाले एकाधिक पंक्तियां)।

यहां, मैंने लेबल के अंत तक पैड न्यूलाइन द्वारा इसे सुलझाने का एक वैकल्पिक तरीका उपयोग किया है (कृपया ध्यान दें कि मुझे वास्तव में UILabel विरासत में मिला है, लेकिन यह आवश्यक नहीं है):

CGSize fontSize = [self.text sizeWithFont:self.font];

finalHeight = fontSize.height * self.numberOfLines;
finalWidth = size.width;    //expected width of label

CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];

int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

for(int i = 0; i < newLinesToPad; i++)
{
    self.text = [self.text stringByAppendingString:@"\n "];
}

मैंने इस उद्देश्य को प्राप्त करने के लिए एक उपयोग समारोह लिखा था। आप एक नज़र डाल सकते हैं:

// adjust the height of a multi-line label to make it align vertical with top
+ (void) alignLabelWithTop:(UILabel *)label {
  CGSize maxSize = CGSizeMake(label.frame.size.width, 999);
  label.adjustsFontSizeToFitWidth = NO;

  // get actual height
  CGSize actualSize = [label.text sizeWithFont:label.font constrainedToSize:maxSize lineBreakMode:label.lineBreakMode];
  CGRect rect = label.frame;
  rect.size.height = actualSize.height;
  label.frame = rect;
}

।कैसे इस्तेमाल करे? (यदि इंटरफ़ेस बिल्डर द्वारा lblHello बनाया गया है, तो मैं कुछ UILabel विशेषताएँ विवरण छोड़ देता हूं)

lblHello.text = @"Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World! Hello World!";
lblHello.numberOfLines = 5;
[Utils alignLabelWithTop:lblHello];

मैंने इसे अपने ब्लॉग पर एक लेख के रूप में भी लिखा: http://fstoke.me/blog/?p=2819


मुझे पता चला है कि इस प्रश्न पर उत्तर अब थोड़ी देर के हैं, इसलिए ऑटो लेआउट प्रशंसकों के लिए इसे जोड़ना।

ऑटो लेआउट इस मुद्दे को बहुत छोटा बनाता है। मान लें कि हम UIView *view में लेबल जोड़ रहे हैं, निम्न कोड यह पूरा करेगा:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
[label setText:@"Some text here"];
[label setTranslatesAutoresizingMaskIntoConstraints:NO];
[view addSubview:label];

[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[label]|" options:0 metrics:nil views:@{@"label": label}]];
[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[label]" options:0 metrics:nil views:@{@"label": label}]];

लेबल की ऊंचाई स्वचालित रूप से गणना की जाएगी (इसके intrinsicContentSize का उपयोग करके) और लेबल view के शीर्ष पर क्षैतिज रूप से किनारे पर स्थित होगा।


यदि आप ऑटोलायआउट का उपयोग कर रहे हैं, तो लंबवत सामग्री सेट करें 1000 से अधिक कोड, या तो कोड या आईबी में। आईबी में आपको इसकी प्राथमिकता 1 को प्राथमिकता देकर और फिर इसे हटाने के द्वारा ऊंचाई की बाधा को दूर करना पड़ सकता है।


इंटरफ़ेस बिल्डर में

  • सबसे बड़ा संभव पाठ के आकार के लिए UILabel सेट करें
  • गुण निरीक्षकों में '0' पर Lines सेट करें

आपके कोड में

  • लेबल का पाठ सेट करें
  • अपने लेबल पर कॉल sizeToFit कॉल करें

सांकेतिक टुकड़ा:

self.myLabel.text = @"Short Title";
[self.myLabel sizeToFit];

UILabel का उप-वर्ग बनाएं। एक जादू की तरह काम करता है:

// TopLeftLabel.h

#import <Foundation/Foundation.h>

@interface TopLeftLabel : UILabel 
{
}

@end

// TopLeftLabel.m

#import "TopLeftLabel.h"

@implementation TopLeftLabel

- (id)initWithFrame:(CGRect)frame 
{
    return [super initWithFrame:frame];
}

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{
    CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];    
    textRect.origin.y = bounds.origin.y;
    return textRect;
}

-(void)drawTextInRect:(CGRect)requestedRect 
{
    CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:actualRect];
}

@end

जैसा कि here चर्चा की गई here


UILabel बजाय आप UITextField उपयोग कर सकते हैं जिसमें लंबवत संरेखण विकल्प है:

textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.userInteractionEnabled = NO; // Don't allow interaction

अगर किसी के लिए यह किसी भी मदद की बात है, तो मुझे एक ही समस्या थी, लेकिन UITextView का उपयोग करने के लिए UILabel का उपयोग करने से स्विच करके बस समस्या को हल करने में सक्षम था। मैं सराहना करता हूं कि यह सभी के लिए नहीं है क्योंकि कार्यक्षमता थोड़ा अलग है।

यदि आप UITextView का उपयोग करने के लिए स्विच करते हैं, तो आप सभी स्क्रॉल व्यू गुणों के साथ-साथ उपयोगकर्ता इंटरैक्शन सक्षम भी बंद कर सकते हैं ... इससे इसे लेबल की तरह कार्य करने के लिए मजबूर किया जाएगा।


जब तक आप किसी भी जटिल कार्य कर रही है नहीं कर रहे हैं, तब तक आप उपयोग कर सकते हैं UITextViewके बजाय UILabels

स्क्रॉल अक्षम करें।

यदि आप टेक्स्ट को पूरी तरह से उपयोगकर्ता sizeToFitऔर sizeThatFits:विधियों को प्रदर्शित करना चाहते हैं


ऊपर दिए गए उत्तर की तरह, लेकिन यह बिल्कुल सही नहीं था, या कोड में थप्पड़ मारना आसान था इसलिए मैंने इसे थोड़ा सा साफ़ कर दिया। इस एक्सटेंशन को या तो अपने .h और .m फ़ाइल में जोड़ें या केवल उस क्रियान्वयन के ऊपर पेस्ट करें जिसका आप इसका उपयोग करना चाहते हैं:

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


@implementation UILabel (VerticalAlign)
- (void)alignTop
{
    CGSize fontSize = [self.text sizeWithFont:self.font];

    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label


    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];


    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

    for(int i=0; i<= newLinesToPad; i++)
    {
        self.text = [self.text stringByAppendingString:@" \n"];
    }
}

- (void)alignBottom
{
    CGSize fontSize = [self.text sizeWithFont:self.font];

    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label


    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];


    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;

    for(int i=0; i< newLinesToPad; i++)
    {
        self.text = [NSString stringWithFormat:@" \n%@",self.text];
    }
}
@end

और फिर उपयोग करने के लिए, अपना टेक्स्ट लेबल में रखें, और उसके बाद इसे संरेखित करने के लिए उचित विधि को कॉल करें:

[myLabel alignTop];

या

[myLabel alignBottom];

Subclass UILabel और ड्राइंग आयत को बाधित करें, इस तरह:

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

    [super drawTextInRect:rect];
}

मैंने न्यूलाइन पैडिंग से जुड़े समाधान की कोशिश की और कुछ मामलों में गलत व्यवहार में भाग गया। मेरे अनुभव में, numberOfLines साथ गड़बड़ के ऊपर ड्रॉइंग रेक्ट को बाधित करना आसान है।

पीएस आप आसानी से UIViewContentMode का समर्थन करने की कल्पना कर सकते हैं:

- (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];
}

एक नई कक्षा बनाएँ

LabelTopAlign

एच फाइल

#import <UIKit/UIKit.h>


@interface KwLabelTopAlign : UILabel {

}

@end

एमएम फ़ाइल

#import "KwLabelTopAlign.h"


@implementation KwLabelTopAlign

- (void)drawTextInRect:(CGRect)rect {
    int lineHeight = [@"IglL" sizeWithFont:self.font constrainedToSize:CGSizeMake(rect.size.width, 9999.0f)].height;
    if(rect.size.height >= lineHeight) {
        int textHeight = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(rect.size.width, rect.size.height)].height;
        int yMax = textHeight;
        if (self.numberOfLines > 0) {
            yMax = MIN(lineHeight*self.numberOfLines, yMax);    
        }

        [super drawTextInRect:CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, yMax)];
    }
}

@end

संपादित करें

यहां एक सरल कार्यान्वयन है जो वही करता है:

#import "KwLabelTopAlign.h"

@implementation KwLabelTopAlign

- (void)drawTextInRect:(CGRect)rect
{
    CGFloat height = [self.text sizeWithFont:self.font
                            constrainedToSize:rect.size
                                lineBreakMode:self.lineBreakMode].height;
    if (self.numberOfLines != 0) {
        height = MIN(height, self.font.lineHeight * self.numberOfLines);
    }
    rect.size.height = MIN(rect.size.height, height);
    [super drawTextInRect:rect];
}

@end

आप TTTAttributedLabel उपयोग कर सकते हैं, यह लंबवत संरेखण का समर्थन करता है।

@property (nonatomic) TTTAttributedLabel* label;
<...>

//view's or viewController's init method
_label.verticalAlignment = TTTAttributedLabelVerticalAlignmentTop;

स्टोरीबोर्ड समाधान: StackView में Label को एम्बेड StackView और स्टैकव्यू के Axis को Horizontal , स्टोरीबोर्ड से Attribute Inspector में Top Alignment करना सबसे सरल और आसान तरीका है।


UILabel पर लंबवत संरेखण सेट करने का कोई तरीका नहीं है, लेकिन आप लेबल के फ्रेम को बदलकर एक ही प्रभाव प्राप्त कर सकते हैं। मैंने अपने लेबल नारंगी बनाये हैं ताकि आप स्पष्ट रूप से देख सकें कि क्या हो रहा है।

ऐसा करने का त्वरित और आसान तरीका यहां दिया गया है:

    [myLabel sizeToFit];

यदि आपके पास लंबे टेक्स्ट वाले लेबल हैं जो एक से अधिक पंक्तियां बनाएंगे, तो numberOfLines 0 सेट करें (शून्य यहां लाइनों की असीमित संख्या है)।

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];

लंबा संस्करण

मैं अपना लेबल कोड में कर दूंगा ताकि आप देख सकें कि क्या हो रहा है। आप इंटरफ़ेस बिल्डर में भी इनमें से अधिकतर सेट अप कर सकते हैं। मेरा सेटअप फ़ोटोशॉप में बनाई गई पृष्ठभूमि छवि के साथ मार्जिन (20 अंक) दिखाने के लिए एक व्यू आधारित ऐप है। लेबल एक आकर्षक नारंगी रंग है ताकि आप देख सकें कि आयामों के साथ क्या चल रहा है।

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 20 point top and left margin. Sized to leave 20 pt at right.
    CGRect labelFrame = CGRectMake(20, 20, 280, 150);
    UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
    [myLabel setBackgroundColor:[UIColor orangeColor]];

    NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
    [myLabel setText:labelText];

    // Tell the label to use an unlimited number of lines
    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

sizeToFit का उपयोग करने की कुछ सीमाएं केंद्र- या दाएं संरेखित पाठ के साथ sizeToFit हैं। यहां क्या होता है:

    // myLabel.textAlignment = NSTextAlignmentRight;
    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

लेबल अभी भी एक निश्चित शीर्ष बाएं कोने के साथ आकार में है। आप मूल लेबल की चौड़ाई को एक चर में सहेज सकते हैं और इसे आकार के बाद सेट कर sizeToFit , या इन समस्याओं का सामना करने के लिए इसे एक निश्चित चौड़ाई दें:

    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    CGRect myFrame = myLabel.frame;
    // Resize the frame's width to 280 (320 - margins)
    // width could also be myOriginalLabelFrame.size.width
    myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
    myLabel.frame = myFrame;

ध्यान दें कि sizeToFit आपके प्रारंभिक लेबल की न्यूनतम चौड़ाई का सम्मान करेगा। यदि आप लेबल के साथ 100 चौड़े और कॉल sizeToFit साथ शुरू करते हैं, तो यह आपको 100 (या थोड़ा कम) चौड़ाई वाला एक (संभवतः बहुत लंबा) लेबल वापस देगा। आप अपना लेबल आकार बदलने से पहले न्यूनतम चौड़ाई पर सेट करना चाहते हैं।

कुछ अन्य चीजें ध्यान दें:

चाहे lineBreakMode का सम्मान किया जाए, इस पर निर्भर करता है कि यह कैसे सेट है। NSLineBreakByTruncatingTail (डिफ़ॉल्ट) sizeToFit बाद अनदेखा किया जाता है, जैसे कि दो दो sizeToFit मोड (सिर और मध्य) हैं। NSLineBreakByClipping भी अनदेखा किया जाता है। NSLineBreakByCharWrapping सामान्य रूप से काम करता है। फ्रेम चौड़ाई अभी भी सही अक्षर तक फिट करने के लिए संकुचित है।

मार्क एमरी ने टिप्पणियों में ऑटो लेआउट का उपयोग करके एनआईबी और स्टोरीबोर्ड के लिए एक फिक्स दिया:

यदि आपका लेबल एक निब या स्टोरीबोर्ड में एक view sizeToFit रूप में शामिल किया गया है जो sizeToFit का उपयोग करता है, तो अपना sizeToFit कॉल को देखने में sizeToFit काम नहीं करेगा, क्योंकि ऑटोलायआउट आकार और view को view के बाद sizeToFit कहा जाता है और तुरंत पूर्ववत कर दिया जाएगा आपके sizeToFit के प्रभाव कॉल करने के प्रभाव। हालांकि, कॉल के sizeToFit से कॉल करने के लिए कॉल करने के लिए sizeToFit काम करेंगे

मेरा मूल उत्तर (वंशावली / संदर्भ के लिए):

यह sizeWithFont:constrainedToSize:lineBreakMode: विधि आकार का उपयोग करता है sizeWithFont:constrainedToSize:lineBreakMode: स्ट्रिंग फिट करने के लिए आवश्यक फ्रेम ऊंचाई की गणना करने के लिए, फिर मूल और चौड़ाई सेट करता है।

जिस पाठ को आप डालना चाहते हैं उसका उपयोग करके लेबल के लिए फ्रेम का आकार बदलें। इस तरह आप किसी भी लाइन को समायोजित कर सकते हैं।

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.dateLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);

self.dateLabel.frame = dateFrame;

अनुकूली यूआई (आईओएस 8 या उसके बाद) के लिए, यूआईएलएबल का वर्टिकल संरेखण स्टोरीबार्ड से गुणों को noOfLines = 0` बदलना है और

प्रतिबन्ध

  1. UILabel LefMargin, राइटमार्गिन और शीर्ष मार्जिन बाधाओं को समायोजित करना।

  2. Content Compression Resistance Priority For Vertical = 1000` के Content Compression Resistance Priority For Vertical बदलें ताकि वर्टिकल> क्षैतिज।

संपादित:

noOfLines=0

और वांछित परिणाम प्राप्त करने के लिए निम्नलिखित बाधाएं पर्याप्त हैं।


  1. नया टेक्स्ट सेट करें:

    myLabel.text = @"Some Text"
  2. लाइनों की maximum number 0 (स्वचालित) पर सेट करें:

    myLabel.numberOfLines = 0
  3. लेबल के फ्रेम को अधिकतम आकार में सेट करें:

    myLabel.frame = CGRectMake(20,20,200,800)
  4. कॉल आकार को फ्रेम आकार को कम करने के लिए sizeToFit करें ताकि सामग्री बस फिट हो:

    [myLabel sizeToFit]

लेबल फ्रेम अब आपके पाठ को फिट करने के लिए पर्याप्त उच्च और चौड़ा है। ऊपरी बाएं अपरिवर्तित होना चाहिए। मैंने इसे केवल शीर्ष बाएं संरेखित पाठ के साथ परीक्षण किया है। अन्य संरेखणों के लिए, आपको फ्रेम को बाद में संशोधित करना पड़ सकता है।

इसके अलावा, मेरे लेबल में शब्द रैपिंग सक्षम है।


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

@interface TopAlignedLabelContainer : UIView
{
}

@end

@implementation TopAlignedLabelContainer

- (void)layoutSubviews
{
    CGRect bounds = self.bounds;

    for (UILabel *label in [self subviews])
    {
        if ([label isKindOfClass:[UILabel class]])
        {
            CGSize fontSize = [label.text sizeWithFont:label.font];

            CGSize textSize = [label.text sizeWithFont:label.font
                                     constrainedToSize:bounds.size
                                         lineBreakMode:label.lineBreakMode];

            label.numberOfLines = textSize.height / fontSize.height;

            label.frame = CGRectMake(0, 0, textSize.width,
                 fontSize.height * label.numberOfLines);
        }
    }
}

@end

यदि अपना खुद का कस्टम व्यू बनाना एक विकल्प है, तो आप ऐसा कुछ कर सकते हैं:

- (void)drawRect:(CGRect)rect
{
    CGRect bounds = self.bounds;
    [self.textColor set];
    [self.text drawInRect:bounds
                 withFont:self.font
            lineBreakMode:UILineBreakModeTailTruncation
                alignment:self.textAlignment];
}

विस्तार समाधान का जिक्र करना:

for(int i=1; i< newLinesToPad; i++) 
    self.text = [self.text stringByAppendingString:@"\n"];

द्वारा प्रतिस्थापित किया जाना चाहिए

for(int i=0; i<newLinesToPad; i++)
    self.text = [self.text stringByAppendingString:@"\n "];

प्रत्येक अतिरिक्त नई लाइन में अतिरिक्त स्थान की आवश्यकता है, क्योंकि आईफोन UILabels के पीछे की गाड़ी रिटर्न को अनदेखा किया जा रहा है :(

इसी तरह, alignBottom को @" \[email protected]%" के स्थान पर @" \[email protected]%" साथ भी अपडेट किया जाना चाहिए (चक्र प्रारंभ करने के लिए "int (int i = 0 ..." के लिए भी बदला जाना चाहिए)।

निम्नलिखित एक्सटेंशन मेरे लिए काम करता है:

// -- file: UILabel+VerticalAlign.h
#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end

// -- file: UILabel+VerticalAlign.m
@implementation UILabel (VerticalAlign)
- (void)alignTop {
    CGSize fontSize = [self.text sizeWithFont:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i<newLinesToPad; i++)
        self.text = [self.text stringByAppendingString:@"\n "];
}

- (void)alignBottom {
    CGSize fontSize = [self.text sizeWithFont:self.font];
    double finalHeight = fontSize.height * self.numberOfLines;
    double finalWidth = self.frame.size.width;    //expected width of label
    CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
    int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
    for(int i=0; i<newLinesToPad; i++)
        self.text = [NSString stringWithFormat:@" \n%@",self.text];
}
@end

फिर [yourLabel alignTop]; कॉल करें [yourLabel alignTop]; या [yourLabel alignBottom]; प्रत्येक आपके लेबल लेबल असाइनमेंट के बाद।


मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन पाठ को लंबवत रूप से संरेखित करना एक बड़ी समस्या है (कम से कम मेरे लिए यह है) और मुझे लगा कि मुझे इस समाधान को साझा करना चाहिए क्योंकि मुझे खुद को नहीं मिला।

DrawRect का उपयोग करना मेरी राय में थोड़ा महंगा है। UILabel को लंबवत रूप से संरेखित करने का उचित तरीका UILabel का उपयोग नहीं करना है। UITextView (multiline UITextField) का उपयोग करें और इस तरह की सामग्री प्रॉपर्टी का निरीक्षण करें:

- (UITextView*)textView{
     if(!_textView){
        UIEdgeInsets insets = UIEdgeInsetsMake(0, 50, 0, 5);
        CGRect frame = CGRectMake(0.0f, 0.0f, 100.0f, 100.0f);
        _textView = [[UITextView alloc]initWithFrame:UIEdgeInsetsInsetRect(frame, insets)];
        _textView.delegate = self;
        _textView.scrollEnabled = YES;
        _textView.bounces = YES;
        _textView.backgroundColor = [UIColor whiteColor];
        [_textView setUserInteractionEnabled:NO];
        [_textView addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];
    }
    return _textView;
}

 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:    (NSDictionary *)change context:(void *)context {
UITextView *tv = object;

CGFloat height = [tv bounds].size.height;
CGFloat contentheight;

#ifdef __IPHONE_7_0
    contentheight = [tv sizeThatFits:CGSizeMake(tv.frame.size.width, FLT_MAX)].height;
#else
    contentheight = [tv contentSize].height;
#endif

    switch(self.verticalAlignment) {
        case VerticalAlignmentBottom:{
            CGFloat topCorrect = ([tv bounds].size.height - contentheight);
            topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);
            tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
        }
        break;
        case VerticalAlignmentMiddle:{
            CGFloat topCorrect = (height - contentheight * [tv zoomScale])/2.0;
            topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
            tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
        }
            break;
        case VerticalAlignmentTop:{
            tv.contentOffset = (CGPoint){.x = 0, .y = 0 };
        }
            break;
        default:
            break;
    }
}

असल में यहां क्या हो रहा है, हम उस कक्षा को सेट करते हैं जो हम पर्यवेक्षक के रूप में हैं, सामग्री को देखकर NSKeyValueObservingOptionNew के विकल्प के साथ आकार बदलें, इसलिए जब भी सामग्री बदलती है, -(void)observeValueForKeyPath:ofObject:change:context:तो कॉल किया जाएगा और फिर आप उचित रूप से टेक्स्ट को संरेखित करने के लिए ऑफसेट आकार की गणना कर सकते हैं ।

मैं इसके लिए क्रेडिट नहीं ले सकता, मूल विचार here से आया था । लेकिन, यह समाधान आईओएस 7 पर काम नहीं करता है। कुछ घंटों के लिए एसओ के आसपास घूमने के बाद, मुझे यह पता चला: आईओएस 7 लंबवत संरेखण फिक्स । कुंजी लाइन हैcontentheight = [tv sizeThatFits:CGSizeMake(tv.frame.size.width, FLT_MAX)].height; ।आईओएस 7 में किसी कारण से, सामग्री प्राप्त करना आकार की ऊंचाई काम नहीं करती है लेकिन यह इसे ठीक करती है। दो समाधानों में से कोई भी अपने आप पर काम नहीं करता था, लेकिन थोड़ी सी झुकाव के बाद, मैं उपरोक्त समाधान को एक साथ संश्लेषित करने में सक्षम था।


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

आप उपयोग कर सकते हैं UITextField। यह सामग्री वर्टिकल एलाइनमेंट peoperty का समर्थन करता है क्योंकि यह एक उप-वर्ग है UIControluserInteractionEnabledउपयोगकर्ता को टेक्स्ट टाइप करने से रोकने के लिए आपको इसे NO पर सेट करना होगा।


तेजी से,

let myLabel : UILabel!

स्क्रीन पर फिट करने के लिए अपने लेबल का टेक्स्ट बनाने के लिए और यह शीर्ष पर है

myLabel.sizeToFit()

स्क्रीन की चौड़ाई या विशिष्ट चौड़ाई आकार में फ़िट होने के लिए लेबल का अपना फ़ॉन्ट बनाने के लिए।

myLabel.adjustsFontSizeToFitWidth = YES

और कुछ पाठ लेबल के लिए संरेखण:

myLabel.textAlignment = .center

myLabel.textAlignment = .left

myLabel.textAlignment = .right

myLabel.textAlignment = .Natural

myLabel.textAlignment = .Justified







text-alignment