टेक्स्ट के आधार पर यूआईबेल की ऊंचाई समायोजित करें


315

विचार करें कि मेरे पास निम्नलिखित पाठ है UILabel(गतिशील पाठ की एक लंबी पंक्ति):

चूंकि विदेशी सेना बहुत हद तक टीम से बाहर निकल जाती है, खिलाड़ियों को अपने लाभ के लिए पोस्ट-एपोकैलिक दुनिया का उपयोग करना चाहिए, जैसे डंपस्टर, खंभे, कार, मलबे और अन्य वस्तुओं के पीछे कवर की मांग करना।

मैं UILabel'sऊंचाई का आकार बदलना चाहता हूं ताकि पाठ में फिट हो सके। मैं UILabelपाठ को लपेटने के लिए निम्नलिखित गुणों का उपयोग कर रहा हूं ।

myUILabel.lineBreakMode = UILineBreakModeWordWrap;
myUILabel.numberOfLines = 0;

कृपया मुझे बताएं कि क्या मैं सही दिशा में नहीं जा रहा हूं। धन्यवाद।



नीचे दिए गए स्विफ्ट संस्करण: stackoverflow.com/a/33945342/1634890
जुआन बोरो

जवाबों:


409

sizeWithFont constrainedToSize:lineBreakMode:उपयोग करने की विधि है। इसका उपयोग कैसे करें का एक उदाहरण नीचे दिया गया है:

//Calculate the expected size based on the font and linebreak mode of your label
// FLT_MAX here simply means no constraint in height
CGSize maximumLabelSize = CGSizeMake(296, FLT_MAX);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font constrainedToSize:maximumLabelSize lineBreakMode:yourLabel.lineBreakMode];   

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

यह 9999 का उपयोग करता है, आप इसे पाठ के लिए कैसे लचीला करेंगे?
क्वांटम्पोटेटो

1
@quantumpotato 9999 केवल उस स्थान के लिए धारक है जहां अधिकतम पाठ को लेने की अनुमति है। आप अपने UI के लिए काम करने वाले किसी भी नंबर का उपयोग कर सकते हैं।
PyjamaSam

9
यदि आप अपने लेबल को इस तरह से आकार दे रहे हैं, तो आप इसे गलत कर रहे हैं । आपको उपयोग करना चाहिए [label sizeToFit]
मारीआन Marierný

5
यह मत भूलो कि sizeWithFontआईओएस 7 में
स्ट्रेचर है

7
इसका पदावनत;
msmq

242

आप सही दिशा में जा रहे थे। आपको बस इतना करना है:

myUILabel.numberOfLines = 0;
myUILabel.text = @"Enter large amount of text here";
[myUILabel sizeToFit];

5
फिट करने के लिए आकार बिल्कुल वही था जो मुझे लपेटने के लिए पाठ की आवश्यकता थी, लंबे समय तक myUILabel.lineBreakMode = UILineBreakModeWordWrap के साथ; myUILabel.numberOfLines = 0;
जैक बेईम्बल

2
उत्तर के रूप में सही और काम करता है के रूप में चिह्नित की तुलना में बहुत आसान समाधान।
memmons

4
@ इंदर कुमार राठौर - मैं इसका उपयोग कई लाइनों के लिए करता हूं, हर समय, इसलिए नंबरऑफलाइन = 0; मुझे लगता है कि यह पहले से तय चौड़ाई को याद कर रहा है, लेकिन मैंने यह मान लिया था कि यह पहले से ही उइबेल के साथ किया गया था।
डोनाल्डिया

@ क्या .. मुझे आपकी पसंद नहीं है .. क्या आप इसके फ्रेम के बारे में बात कर रहे हैं ??
इंदर कुमार राठौर

@DonLea, बहुत बहुत धन्यवाद। समाधान के लिए आपके सरल दृष्टिकोण ने मुझे मेरी समस्या को हल करने में मदद की।
नवद

44

IOS 6 में Apple ने UILabel में एक प्रॉपर्टी जोड़ी है जो डायनामिक वर्टिकल रिसाइज़िंग लेबल्स को बहुत सरल बनाती है: पसंदीदामैक्स लाईटविदथ

इस प्रॉपर्टी को लाइनब्रीकमोड = NSLineBreakByWordWrapping और sizeToFit विधि के साथ संयोजन में उपयोग करने से आसानी से पूरे पाठ को समायोजित करने वाली ऊँचाई के लिए एक यूबेल उदाहरण का आकार बदलने की अनुमति मिलती है।

IOS दस्तावेज़ीकरण का एक उद्धरण:

पसंदीदामाइकलआउट एक बहुस्तरीय लेबल के लिए पसंदीदा अधिकतम चौड़ाई (बिंदुओं में)।

चर्चा यह गुण लेबल के आकार को प्रभावित करता है जब लेआउट बाधाएं उस पर लागू होती हैं। लेआउट के दौरान, यदि पाठ इस संपत्ति द्वारा निर्दिष्ट चौड़ाई से आगे निकलता है, तो अतिरिक्त पाठ एक या अधिक नई लाइनों में प्रवाहित होता है, जिससे लेबल की ऊंचाई बढ़ जाती है।

एक नमुना:

...
UILabel *status = [[UILabel alloc] init];
status.lineBreakMode = NSLineBreakByWordWrapping;
status.numberOfLines = 5; // limits to 5 lines; use 0 for unlimited.

[self addSubview:status]; // self here is the parent view

status.preferredMaxLayoutWidth = self.frame.size.width; // assumes the parent view has its frame already set.

status.text = @"Some quite lengthy message may go here…";
[status sizeToFit];
[status setNeedsDisplay];
...

39

कोड की एकल पंक्ति को जोड़े बिना इस काम को पूरी तरह से जांचें। (ऑटोलैयूट का उपयोग करके)

मैंने आपकी आवश्यकता के अनुसार आपके लिए एक डेमो बनाया । इसे नीचे दिए गए लिंक से डाउनलोड करें,

ऑटिस्लाइज़ उइवे और उइलैबेल

कदम से कदम गाइड: -

चरण 1: - UIView को विवश करें

1) अग्रणी 2) शीर्ष 3) अनुगामी (मेनव्यू से)

यहां छवि विवरण दर्ज करें

चरण 2: - लेबल 1 पर विवश करें

1) अग्रणी 2) शीर्ष 3) अनुगामी (यह पर्यवेक्षण से है)

यहां छवि विवरण दर्ज करें

चरण 3: - लेबल 2 के लिए विवश सेट करें

1) अग्रणी 2) अनुगामी (यह पर्यवेक्षण से है)

यहां छवि विवरण दर्ज करें

चरण 4: - सबसे मुश्किल चाल यूविले से उइलैबेल को बॉटन देते हैं।

यहां छवि विवरण दर्ज करें

चरण 5: - (वैकल्पिक) UIButton को विवश करें

1) अग्रणी 2) नीचे 3) अनुगामी 4) निश्चित ऊँचाई (मेनव्यू से)

यहां छवि विवरण दर्ज करें

आउटपुट: -

यहां छवि विवरण दर्ज करें

नोट: - सुनिश्चित करें कि आपने लेबल संपत्ति में पंक्तियों की संख्या = 0 निर्धारित की है।

यहां छवि विवरण दर्ज करें

मुझे उम्मीद है कि यह जानकारी UILabel की ऊँचाई के अनुसार ऑटोरेस्सिज़ UIView को समझने के लिए पर्याप्त होगी और पाठ के अनुसार ऑटिज़लाइज़ UILabel।


और क्या होगा अगर आप भी सफेद पृष्ठभूमि वाले दृश्य के तहत कुछ विचार रखना चाहेंगे? इसे ऊँचाई नहीं देने से SB में कुछ लाल रेखाएँ दिखेंगी "के लिए विवशता के लिए: Y स्थिति या ऊँचाई"
बोगदान रज़वान

इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। इब के साथ यह सही तरीका है।
राणा टलाल

@ SPQR3 समस्या क्या है? इसने बहुत से लोगों और इसके काम करने में मदद की।
बादल शाह

36

इस प्रोग्राम को करने के बजाय, आप इसे डिज़ाइन करते समय स्टोरीबोर्ड / XIB में कर सकते हैं।

  • विशेषता निरीक्षक में UIlabel की पंक्तियों की संख्या को 0 पर सेट करें ।
  • फिर आवश्यकता के अनुसार चौड़ाई बाधा / (या) अग्रणी और पीछे बाधा निर्धारित करें।
  • फिर न्यूनतम मूल्य के साथ ऊंचाई की सीमा निर्धारित करें । अंत में, ऊंचाई बाधा आपके द्वारा जोड़े विशेषता निरीक्षक के बगल में एक को चुनें और आकार निरीक्षक में बदल ऊंचाई बाधा के संबंध से करने के लिए बराबर - से अधिक

यह एक UITableView में कस्टम xib सेल में एम्बेडेड UILabel के लिए काम करता है।
गैंग फैंग

आपके उत्तर के अनुसार मैंने अपने लेबल पर लगातार ऊँचाई निर्धारित की और निम्न (250) को प्राथमिकता दी और त्रुटियां गायब हो गईं। (Do सेट करने की जरूरत नहीं के बराबर - एक से अधिक)
हामिद रजा अंसारी

15

मदद के लिए धन्यवाद दोस्तों, यहां मैंने कोड की कोशिश की जो मेरे लिए काम कर रहा है

   UILabel *instructions = [[UILabel alloc]initWithFrame:CGRectMake(10, 225, 300, 180)];
   NSString *text = @"First take clear picture and then try to zoom in to fit the ";
   instructions.text = text;
   instructions.textAlignment = UITextAlignmentCenter;
   instructions.lineBreakMode = NSLineBreakByWordWrapping;
   [instructions setTextColor:[UIColor grayColor]];

   CGSize expectedLabelSize = [text sizeWithFont:instructions.font 
                                constrainedToSize:instructions.frame.size
                                    lineBreakMode:UILineBreakModeWordWrap];

    CGRect newFrame = instructions.frame;
    newFrame.size.height = expectedLabelSize.height;
    instructions.frame = newFrame;
    instructions.numberOfLines = 0;
    [instructions sizeToFit];
    [self addSubview:instructions];

2
sizeWithFont पदावनत है।
msmq

12

ऊपर iOS7 और पूर्व में iOS7 का समाधान

//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import <UIKit/UIKit.h>

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define iOS7_0 @"7.0"

@interface UILabel (DynamicHeight)

/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */

-(CGSize)sizeOfMultiLineLabel;

@end


//
//  UILabel+DynamicHeight.m
//  For StackOverFlow
//
//  Created by Vijay on 24/02/14.
//  Copyright (c) 2014 http://Vijay-Apple-Dev.blogspot.com. All rights reserved.
//

#import "UILabel+DynamicHeight.h"

@implementation UILabel (DynamicHeight)
/*====================================================================*/

/* Calculate the size,bounds,frame of the Multi line Label */

/*====================================================================*/
/**
 *  Returns the size of the Label
 *
 *  @param aLabel To be used to calculte the height
 *
 *  @return size of the Label
 */
-(CGSize)sizeOfMultiLineLabel{

    NSAssert(self, @"UILabel was nil");

    //Label text
    NSString *aLabelTextString = [self text];

    //Label font
    UIFont *aLabelFont = [self font];

    //Width of the Label
    CGFloat aLabelSizeWidth = self.frame.size.width;


    if (SYSTEM_VERSION_LESS_THAN(iOS7_0)) {
        //version < 7.0

        return [aLabelTextString sizeWithFont:aLabelFont
                            constrainedToSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                lineBreakMode:NSLineBreakByWordWrapping];
    }
    else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(iOS7_0)) {
        //version >= 7.0

        //Return the calculated size of the Label
        return [aLabelTextString boundingRectWithSize:CGSizeMake(aLabelSizeWidth, MAXFLOAT)
                                              options:NSStringDrawingUsesLineFragmentOrigin
                                           attributes:@{
                                                        NSFontAttributeName : aLabelFont
                                                        }
                                              context:nil].size;

    }

    return [self bounds].size;

}

@end

UITableViewController के उपवर्ग में, मुझे यह विधि कहां से मिलनी चाहिए?
होमम

जहां आप लेबल की ऊँचाई की गणना करना चाहते हैं तो इस विधि को कॉल करें। तब तालिका दृश्य की ऊंचाई समायोजित करें। जहां आपके पास इंडेक्स विधि में पंक्ति के लिए टेबलव्यू ऊंचाई है। सभी वर्टिकल लेबल टेक्स्ट को यू के रूप में परिकलित करें
Vijay-Apple-Dev.blogspot.com

Vijay sizeWithFont समाप्त हो गया है।
user3182143

10

चूंकि sizeWithFont पदावनत है इसलिए मैं इसके बजाय इसका उपयोग करता हूं।

यह एक लेबल विशिष्ट गुण प्राप्त करता है।

-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text{

    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName:label.font}];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){label.frame.size.width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];

    return ceil(rect.size.height);
}

6

यहाँ एक श्रेणी संस्करण है:

UILabel + AutoSize.h #import

@interface UILabel (AutoSize)

- (void) autosizeForWidth: (int) width;

@end

UILabel + AutoSize.m

#import "UILabel+AutoSize.h"

@implementation UILabel (AutoSize)

- (void) autosizeForWidth: (int) width {
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    CGSize maximumLabelSize = CGSizeMake(width, FLT_MAX);
    CGSize expectedLabelSize = [self.text sizeWithFont:self.font constrainedToSize:maximumLabelSize lineBreakMode:self.lineBreakMode];
    CGRect newFrame = self.frame;
    newFrame.size.height = expectedLabelSize.height;
    self.frame = newFrame;
}

@end

6

आप TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath विधि को निम्नलिखित तरीके से लागू कर सकते हैं (उदाहरण के लिए):

#define CELL_LABEL_TAG 1

- (UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *text = @"my long text";

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:identifier] autorelease];
    }

    CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
    CGFloat height = [self textHeight:text] + 10;
    CGRect frame = CGRectMake(10.0f, 10.0f, width, height);

    UILabel *cellLabel = [[UILabel alloc] initWithFrame:frame];
    cellLabel.tag = CELL_LABEL_TAG;
    cellLabel.textColor = [UIColor blackColor];
    cellLabel.backgroundColor = [UIColor clearColor];
    cellLabel.textAlignment = UITextAlignmentLeft;
    cellLabel.font = [UIFont systemFontOfSize:12.0f];
    [cell.contentView addSubview:cellLabel];
    [cellLabel release];

    return cell;
}

UILabel *label = (UILabel *)[cell viewWithTag:CELL_LABEL_TAG];
label.text = text;
label.numberOfLines = 0;
[label sizeToFit];
return cell;

इसके अलावा का उपयोग NSStringके sizeWithFont:constrainedToSize:lineBreakMode:पाठ की ऊंचाई की गणना करने के विधि।


6

स्विफ्ट 4 और इसके बाद के संस्करण के लिए इस उत्तर के आधार पर यूआईबेल एक्सटेंशन

extension UILabel {

    func retrieveTextHeight () -> CGFloat {
        let attributedText = NSAttributedString(string: self.text!, attributes: [NSFontAttributeName:self.font])

        let rect = attributedText.boundingRect(with: CGSize(width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil)

        return ceil(rect.size.height)
    }

}

की तरह इस्तेमाल किया जा सकता है:

self.labelHeightConstraint.constant = self.label.retrieveTextHeight()

4

और जो लोग iOS 8 में माइग्रेट कर रहे हैं, उनके लिए यहां स्विफ्ट के लिए एक क्लास एक्सटेंशन है:

extension UILabel {

    func autoresize() {
        if let textNSString: NSString = self.text {
            let rect = textNSString.boundingRectWithSize(CGSizeMake(self.frame.size.width, CGFloat.max),
                options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                attributes: [NSFontAttributeName: self.font],
                context: nil)
            self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, rect.height)
        }
    }

}

4

मेरे लिए काम करने का सबसे आसान और बेहतर तरीका था कि स्टोरीबोर्ड में लेबल लगाने के लिए ऊँचाई की कसौटी को कम और प्राथमिकता निर्धारित की जाए (यानी 250)।

इसलिए आपको स्टोरीबोर्ड के लिए, ऊंचाई और चौड़ाई को प्रोग्रामेटिक रूप से गणना करने के बारे में चिंता करने की आवश्यकता नहीं है।


4

मेरा दृष्टिकोण उलीबेल की गतिशील ऊंचाई की गणना करने के लिए।

    let width = ... //< width of this label 
    let text = ... //< display content

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.preferredMaxLayoutWidth = width

    // Font of this label.
    //label.font = UIFont.systemFont(ofSize: 17.0)
    // Compute intrinsicContentSize based on font, and preferredMaxLayoutWidth
    label.invalidateIntrinsicContentSize() 
    // Destination height
    let height = label.intrinsicContentSize.height

समारोह के लिए लपेटें:

func computeHeight(text: String, width: CGFloat) -> CGFloat {
    // A dummy label in order to compute dynamic height.
    let label = UILabel()

    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping
    label.font = UIFont.systemFont(ofSize: 17.0)

    label.preferredMaxLayoutWidth = width
    label.text = text
    label.invalidateIntrinsicContentSize()

    let height = label.intrinsicContentSize.height
    return height
}

3

अपडेटेड विधि

+ (CGFloat)heightForText:(NSString*)text font:(UIFont*)font withinWidth:(CGFloat)width {

    CGSize constraint = CGSizeMake(width, 20000.0f);
    CGSize size;

    CGSize boundingBox = [text boundingRectWithSize:constraint
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:@{NSFontAttributeName:font}
                                                  context:nil].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));

    return size.height;
}

3

यह उद्देश्य-सी का उपयोग करके UILabel ऊँचाई पाने के लिए कोड की एक पंक्ति है:

labelObj.numberOfLines = 0;
CGSize neededSize = [labelObj sizeThatFits:CGSizeMake(screenWidth, CGFLOAT_MAX)];

और .height का उपयोग करके आपको लेबल की ऊंचाई इस प्रकार मिलेगी:

neededSize.height

सबसे अच्छा वर्तमान उत्तर।
माइक

3

आप नीचे दिए गए कोड का उपयोग करके ऊंचाई प्राप्त कर सकते हैं

आपको पास होना है

  1. पाठ 2. फ़ॉन्ट 3. लेबल चौड़ाई

    func heightForLabel(text: String, font: UIFont, width: CGFloat) -> CGFloat {
    
       let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
       label.numberOfLines = 0
       label.lineBreakMode = NSLineBreakMode.byWordWrapping
       label.font = font
       label.text = text
       label.sizeToFit()
    
       return label.frame.height
    }

2

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

[cell.contentView addSubview:cellLabel];

तालिका दृश्य में: cellForRowAtIndexPath: विधि जिसे लेबल दृश्य को लगातार पिछले दृश्य के शीर्ष पर प्रदान किया गया था, जब मैंने सेल को संपादित किया था। पाठ पिक्सेलेटेड हो गया, और जब कुछ डिलीट या बदला गया, तो नया संस्करण पिछले संस्करण में दिखाई दे रहा था। मैंने इस समस्या को हल किया है:

if ([[cell.contentView subviews] count] > 0) {
    UIView *test = [[cell.contentView subviews] objectAtIndex:0];
    [test removeFromSuperview];
}
[cell.contentView insertSubview:cellLabel atIndex:0];

कोई और अधिक अजीब लेयरिंग। अगर इसे संभालने का कोई बेहतर तरीका है, तो कृपया मुझे बताएं।


2
UILabel *itemTitle = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 10,100, 200.0f)];
itemTitle.text = @"aseruy56uiytitfesh";
itemTitle.adjustsFontSizeToFitWidth = NO;
itemTitle.autoresizingMask = UIViewAutoresizingFlexibleWidth;
itemTitle.font = [UIFont boldSystemFontOfSize:18.0];
itemTitle.textColor = [UIColor blackColor];
itemTitle.shadowColor = [UIColor whiteColor];
itemTitle.shadowOffset = CGSizeMake(0, 1);
itemTitle.backgroundColor = [UIColor blueColor];
itemTitle.lineBreakMode = UILineBreakModeWordWrap;
itemTitle.numberOfLines = 0;
[itemTitle sizeToFit];
[self.view addSubview:itemTitle];

यहां इसका उपयोग करें सभी गुण लेबल पर उपयोग किए जाते हैं और आइटम में पाठ को बढ़ाकर इसका परीक्षण करते हैं

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

यह आप की जरूरत के रूप में perfetc जवाब दिखाएगा


2

आप इसे एक विधि के रूप में भी उपयोग कर सकते हैं। @Pyjamasam बहुत अधिक सच है तो मैं सिर्फ इसकी विधि बना रहा हूं। यह किसी और के लिए उपयोगी हो सकता है

-(CGRect)setDynamicHeightForLabel:(UILabel*)_lbl andMaxWidth:(float)_width{
    CGSize maximumLabelSize = CGSizeMake(_width, FLT_MAX);

    CGSize expectedLabelSize = [_lbl.text sizeWithFont:_lbl.font constrainedToSize:maximumLabelSize lineBreakMode:_lbl.lineBreakMode];

    //adjust the label the the new height.
    CGRect newFrame = _lbl.frame;
    newFrame.size.height = expectedLabelSize.height;
    return newFrame;
}

और बस इसे इस तरह सेट करें

label.frame = [self setDynamicHeightForLabel:label andMaxWidth:300.0];

2

निम्नलिखित Swift3 में ऐसा करने के लिए कोड है:

 let labelSizeWithFixedWith = CGSize(width: 300, height: CGFloat.greatestFiniteMagnitude)
            let exactLabelsize = self.label.sizeThatFits(labelSizeWithFixedWith)
            self.label.frame = CGRect(origin: CGPoint(x: 20, y: 20), size: exactLabelsize)

2

उपरोक्त उत्तरों को जोड़ना:

इसे आसानी से स्टोरीबोर्ड के माध्यम से प्राप्त किया जा सकता है।

  1. उलीबेले के लिए बाधा निर्धारित करें। (मेरे मामले में मैंने शीर्ष, बाईं और निश्चित चौड़ाई की)
  2. गुण निरीक्षक में लाइन की संख्या को 0 पर सेट करें
  3. गुण निरीक्षक में वर्डवाप को लाइन ब्रेक सेट करें ।

उइलाबेल ऊंचाई समायोजित करें


1

एक लाइन है क्रिस का जवाब गलत है।

newFrame.size.height = maximumLabelSize.height;

होना चाहिए

newFrame.size.height = expectedLabelSize.height;

इसके अलावा, यह सही समाधान है।


1

अंत में, यह काम किया। आप लोगों को धन्यवाद।

मुझे यह काम करने के लिए नहीं मिल रहा था क्योंकि मैं heightForRowAtIndexPathविधि में लेबल का आकार बदलने की कोशिश कर रहा था :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

और (हाँ मुझे मूर्ख), मैं cellForRowAtIndexPathविधि में डिफ़ॉल्ट रूप से लेबल का आकार बदल रहा था - मैं उस कोड को देख रहा था जिसे मैंने लिखा था -

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

1
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    cellIdentifier = @"myCell";
    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    cell.myUILabel.lineBreakMode = UILineBreakModeWordWrap;        
    cell.myUILabel.numberOfLines = 0;
    cell.myUILabel.text = @"Some very very very very long text....."
    [cell.myUILabel.criterionDescriptionLabel sizeToFit];    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    CGFloat rowHeight = cell.myUILabel.frame.size.height + 10;

    return rowHeight;    
}

2
क्या आप कुछ स्पष्टीकरण जोड़ सकते हैं कि आपका समाधान ओपी के मुद्दे को कैसे हल करता है?

1
आप UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath] नहीं पूछ सकते;
ऊँचाई में, कैसेटैक्सएंडएक्सपैथ

1
NSString *str = @"Please enter your text......";
CGSize lblSize = [str sizeWithFont:[UIFont systemFontOfSize:15] constrainedToSize: CGSizeMake(200.0f, 600.0f) lineBreakMode: NSLineBreakByWordWrapping];

UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(60, 20, 200, lblSize.height);
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.font = [UIFont systemFontOfSize:15];
label.text = str;
label.backgroundColor = [UIColor clearColor];
[label sizeToFit];
[self.view addSubview:label];

1

मेरा कोड:

UILabel *label      = [[UILabel alloc] init];
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.text          = text;
label.textAlignment = NSTextAlignmentCenter;
label.font          = [UIFont fontWithName:_bodyTextFontFamily size:_bodyFontSize];

CGSize size = [label sizeThatFits:CGSizeMake(width, MAXFLOAT)];


float height        = size.height;
label.frame         = CGRectMake(x, y, width, height);

1

यह तरीका सही ऊंचाई देगा

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{
CGSize constraint = CGSizeMake(width , 20000.0f);
CGSize title_size;
float totalHeight;


title_size = [text boundingRectWithSize:constraint
                                options:NSStringDrawingUsesLineFragmentOrigin
                             attributes:@{ NSFontAttributeName : font }
                                context:nil].size;

totalHeight = ceil(title_size.height);

CGFloat height = MAX(totalHeight, 40.0f);
return height;
}

स्पष्ट एट्रिब्यूशन के बिना कहीं और से सामग्री की नकल न करें। इसे साहित्यिक चोरी के रूप में देखा जाता है। Stackoverflow.com/help/referencing ( stackoverflow.com/a/25158206/444991 ) देखें ।
मैट

1

स्विफ्ट 2:

    yourLabel.text = "your very long text"
    yourLabel.numberOfLines = 0
    yourLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping
    yourLabel.frame.size.width = 200
    yourLabel.frame.size.height = CGFloat(MAXFLOAT)
    yourLabel.sizeToFit()

दिलचस्प लाइनें अधिकतम फ्लोट की sizeToFit()स्थापना के साथ संयोजन में हैं frame.size.height, यह लंबे पाठ के लिए जगह sizeToFit()देगा , लेकिन यह केवल आवश्यक उपयोग करने के लिए मजबूर करेगा, लेकिन हमेशा इसे स्थापित करने के बाद कॉल करें .frame.size.height

मैं .backgroundColorडीबग उद्देश्यों के लिए सेट करने की सलाह देता हूं , इस तरह आप प्रत्येक मामले के लिए फ्रेम को प्रदान करते हुए देख सकते हैं।


1
yourLabel.frame.heightकेवल एक संपत्ति है
फिल हडसन

2
yourLabel.frame.size. उपलब्धता और yourLabel.frame.size.height केवल
कलज़ोन

1
myLabel.text = "your very long text"
myLabel.numberOfLines = 0
myLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping

कृपया स्टोरीबोर्ड में UILable के लिए ऊपर बाएं नीचे दाएं सहित बाधाओं को सेट करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.