Điều chỉnh chiều cao UILabel tùy thuộc vào văn bản


315

Hãy xem xét tôi có văn bản sau trong một UILabel(một dòng dài của văn bản động):

Vì quân đội ngoài hành tinh vượt trội so với đội, người chơi phải sử dụng thế giới hậu tận thế để tận dụng lợi thế của mình, như tìm kiếm vỏ bọc phía sau thùng rác, cột trụ, ô tô, gạch vụn và các vật thể khác.

Tôi muốn thay đổi kích thước UILabel'schiều cao để văn bản có thể vừa. Tôi đang sử dụng các thuộc tính sau UILabelđể tạo văn bản bên trong để bọc.

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

Xin vui lòng cho tôi biết nếu tôi không đi đúng hướng. Cảm ơn.



Phiên bản Swift xuống bên dưới: stackoverflow.com/a/33945342/1634890
Juan Boero

Câu trả lời:


409

sizeWithFont constrainedToSize:lineBreakMode:là phương pháp để sử dụng. Một ví dụ về cách sử dụng nó dưới đây:

//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;

Điều này sử dụng 9999, làm thế nào bạn có thể linh hoạt với văn bản?
quantumpotato

1
@quantumpotato 9999 chỉ là nơi giữ chỗ cho không gian tối đa mà văn bản được phép chiếm. Bạn có thể sử dụng bất kỳ số nào hoạt động cho giao diện người dùng của bạn.
PyjamaSam

9
Nếu bạn định cỡ nhãn của bạn như thế này, bạn đang làm sai . Bạn nên sử dụng [label sizeToFit].
Marián Černý

5
Đừng quên điều đó sizeWithFontkhông được chấp nhận trong iOS 7. stackoverflow.com/questions/18897896/NH
attomos

7
Nó không dùng nữa;
msmq

242

Bạn đã đi đúng hướng. Tất cả bạn cần làm là:

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

5
Kích thước phù hợp là chính xác những gì tôi cần để có được văn bản để bọc, dài với myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0;
Jack BeNimble

2
Một giải pháp dễ dàng hơn nhiều so với câu trả lời được đánh dấu là chính xác và cũng hoạt động tốt.
memmons

4
@Inder Kumar Rathore - Tôi sử dụng điều này cho nhiều dòng, mọi lúc, do đó numberOfLines = 0; Tôi đoán nó thiếu cài đặt chiều rộng được ưu tiên trước, nhưng tôi cho rằng điều đó đã được thực hiện với init của UILabel.
DonnaLea

@Donna .. Tôi không nhận được sự ưa thích của bạn với .. bạn đang nói về khung của nó à ??
Inder Kumar Rathore

@DonnaLea, Cảm ơn bạn rất nhiều. cách tiếp cận đơn giản của bạn cho giải pháp cũng giúp tôi giải quyết vấn đề của mình.
Naved

44

Trong iOS 6, Apple đã thêm một thuộc tính vào UILabel giúp đơn giản hóa đáng kể việc thay đổi kích thước dọc của nhãn: preferMaxLayoutWidth .

Sử dụng thuộc tính này kết hợp với phương thức lineBreakMode = NSLineBreakByWordWrappingsizeToFit cho phép dễ dàng thay đổi kích thước một đối tượng UILabel theo chiều cao phù hợp với toàn bộ văn bản.

Một trích dẫn từ tài liệu iOS:

ưa thíchMaxLayoutWidth Chiều rộng tối đa ưa thích (tính bằng điểm) cho nhãn đa dòng.

Thảo luận Thuộc tính này ảnh hưởng đến kích thước của nhãn khi các ràng buộc bố cục được áp dụng cho nó. Trong khi bố trí, nếu văn bản vượt quá chiều rộng được chỉ định bởi thuộc tính này, văn bản bổ sung sẽ được chuyển đến một hoặc nhiều dòng mới, do đó làm tăng chiều cao của nhãn.

Một ví dụ:

...
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

Kiểm tra công việc này hoàn hảo mà không cần thêm dòng mã. (Sử dụng Tự động thanh toán)

Tôi đã làm một bản demo cho bạn theo yêu cầu của bạn. Tải xuống từ liên kết dưới đây,

Tự động hóa UIView và UILabel

Hướng dẫn từng bước một :-

Bước 1: - Đặt ràng buộc thành UIView

1) Dẫn đầu 2) Top 3) Trailing (Từ mainview)

nhập mô tả hình ảnh ở đây

Bước 2: - Đặt ràng buộc thành Nhãn 1

1) Dẫn đầu 2) Top 3) Trailing (Từ đó là giám sát)

nhập mô tả hình ảnh ở đây

Bước 3: - Đặt ràng buộc thành Nhãn 2

1) Dẫn đầu 2) Trailing (Từ đó là giám sát)

nhập mô tả hình ảnh ở đây

Bước 4: - Hầu hết các mánh khóe đều tặng bỉm cho UILabel từ UIView.

nhập mô tả hình ảnh ở đây

Bước 5: - (Tùy chọn) Đặt ràng buộc thành UIButton

1) Dẫn đầu 2) Dưới 3) Trailing 4) Chiều cao cố định (Từ khung nhìn chính)

nhập mô tả hình ảnh ở đây

Đầu ra: -

nhập mô tả hình ảnh ở đây

Lưu ý: - Đảm bảo bạn đã đặt Số dòng = 0 trong thuộc tính Nhãn.

nhập mô tả hình ảnh ở đây

Tôi hy vọng thông tin này đủ để hiểu Autoresize UIView theo chiều cao của UILabel và Autoresize UILabel Theo văn bản.


Và nếu bạn muốn có một số khung nhìn dưới chế độ xem nền trắng thì sao? Không cho nó chiều cao sẽ hiển thị một số đường màu đỏ trong SB cho "Cần ràng buộc cho: vị trí hoặc chiều cao của Y"
Bogdan Razvan

điều này cần được đánh dấu là câu trả lời đúng. Đây là cách đúng đắn với ib.
Rana Tallal

@ SPQR3 có vấn đề gì vậy? nó đã giúp rất nhiều người và nó hoạt động tốt.
Badal Shah

36

Thay vì làm điều này theo lập trình, bạn có thể làm điều này trong Storyboard / XIB trong khi thiết kế.

  • Đặt thuộc tính số dòng của UIlabel thành 0 trong trình kiểm tra thuộc tính.
  • Sau đó đặt ràng buộc chiều rộng / (hoặc) ràng buộc hàng đầu và theo dõi theo yêu cầu.
  • Sau đó đặt ràng buộc chiều cao với giá trị tối thiểu . Cuối cùng chọn giới hạn chiều cao bạn đã thêm và trong trình kiểm tra kích thước, bên cạnh trình kiểm tra thuộc tính, thay đổi quan hệ ràng buộc về chiều cao từ bằng - lớn hơn .

Cái này hoạt động cho UILabel được nhúng trong một ô xib tùy chỉnh trong UITableView.
Gang Fang

Theo câu trả lời của bạn, tôi đặt chiều cao không đổi cho nhãn của mình và đặt mức ưu tiên đó thành Thấp (250) và các lỗi biến mất. (Không cần đặt bằng - lớn hơn)
Hamid Reza Ansari

15

Cảm ơn mọi người đã giúp đỡ, đây là đoạn mã tôi đã thử làm việc cho tôi

   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 không được dùng nữa.
msmq

12

Giải pháp cho iOS7 trước và iOS7 ở trên

//
//  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

Trong lớp con của UITableViewContaptor, tôi nên gọi phương thức này ở đâu?
Homam

Trường hợp bạn muốn tính chiều cao nhãn thì gọi phương thức này. sau đó điều chỉnh chiều cao của chế độ xem bảng. nơi bạn có chiều cao xem bảng cho hàng tại phương thức chỉ mục. tính toán tất cả các nhãn dọc văn bản khi bạn cần
Vijay-Apple-Dev.blogspot.com

Kích thước VijayWithFont bị lỗi.
dùng3182143

10

Vì sizeWithFont không được dùng nữa nên tôi sử dụng cái này thay thế.

cái này có được thuộc tính nhãn cụ thể.

-(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

Đây là một phiên bản thể loại:

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

Bạn có thể thực hiện TableViewController's (UITableViewCell *)tableView:cellForRowAtIndexPath phương thức theo cách sau (ví dụ):

#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;

Cũng sử dụng NSStringcủa sizeWithFont:constrainedToSize:lineBreakMode:phương pháp để tính toán chiều cao của văn bản.


6

Tiện ích mở rộng UILabel dựa trên câu trả lời này cho Swift 4 trở lên

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)
    }

}

Có thể được sử dụng như:

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

4

Và đối với những người đang chuyển sang iOS 8, đây là tiện ích mở rộng lớp cho Swift:

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

Cách dễ nhất và tốt hơn phù hợp với tôi là áp dụng giới hạn chiều cao cho nhãn và đặt mức độ ưu tiên thành thấp , tức là (250) trong bảng phân cảnh.

Vì vậy, bạn không cần phải lo lắng về việc tính toán chiều cao và chiều rộng theo chương trình, nhờ vào bảng phân cảnh.


4

Cách tiếp cận của tôi để tính chiều cao động của UILabel.

    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

Bọc để hoạt động:

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

Phương pháp cập nhật

+ (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

Đây là một dòng mã để lấy Chiều cao UILabel bằng Objective-c:

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

và sử dụng .height bạn sẽ nhận được chiều cao của nhãn như sau:

neededSize.height

Câu trả lời tốt nhất hiện nay.
Mike

3

Bạn có thể lấy chiều cao bằng mã dưới đây

Bạn phải vượt qua

  1. văn bản 2. phông chữ 3. chiều rộng nhãn

    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

Cảm ơn cho bài viết này. Nó giúp tôi rất nhiều. Trong trường hợp của tôi, tôi cũng đang chỉnh sửa văn bản trong một bộ điều khiển xem riêng biệt. Tôi nhận thấy rằng khi tôi sử dụng:

[cell.contentView addSubview:cellLabel];

trong bảngView: cellForRowAtIndexPath: phương thức mà chế độ xem nhãn được hiển thị liên tục trên đầu của chế độ xem trước mỗi lần tôi chỉnh sửa ô. Văn bản trở thành pixelated và khi một cái gì đó bị xóa hoặc thay đổi, phiên bản trước đó sẽ hiển thị dưới phiên bản mới. Đây là cách tôi giải quyết vấn đề:

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

Không còn lớp lạ nữa. Nếu có một cách tốt hơn để xử lý việc này, xin vui lòng cho tôi biết.


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

sử dụng ở đây tất cả các thuộc tính được sử dụng trên nhãn và kiểm tra nó bằng cách tăng văn bản trong itemTitle.text như

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

nó sẽ hiển thị câu trả lời perfetc khi bạn cần


2

Bạn cũng có thể sử dụng nó như một phương pháp. @Pyjamasam rất đúng vì vậy tôi chỉ đang thực hiện phương pháp của nó. Nó có thể hữu ích cho một số người khác

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

và chỉ cần đặt nó như thế này

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

2

Để làm điều này trong Swift3 sau đây là mã:

 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

Thêm vào các câu trả lời trên:

Điều này có thể dễ dàng đạt được thông qua bảng phân cảnh.

  1. Đặt ràng buộc cho UILabel. (Trong trường hợp của tôi, tôi đã làm chiều rộng trên cùng, bên trái và chiều rộng cố định)
  2. Đặt Số dòng thành 0 trong Trình theo dõi thuộc tính
  3. Đặt ngắt dòng thành WordWrap trong Trình kiểm tra thuộc tính.

Điều chỉnh chiều cao của UILabel


1

Một dòng là câu trả lời của Chris là sai.

newFrame.size.height = maximumLabelSize.height;

nên là

newFrame.size.height = expectedLabelSize.height;

Ngoài ra, đó là giải pháp chính xác.


1

Cuối cùng, nó đã làm việc. Cảm ơn các bạn.

Tôi đã không làm cho nó hoạt động vì tôi đã cố gắng thay đổi kích thước nhãn trong heightForRowAtIndexPathphương thức:

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

và (vâng tôi thật ngốc), tôi đã thay đổi kích thước nhãn thành mặc định trong cellForRowAtIndexPathphương thức - tôi đã xem mã tôi đã viết trước đó:

- (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
Bạn có thể thêm một số giải thích về cách giải pháp của bạn giải quyết vấn đề của OP không?

1
bạn không thể yêu cầu UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; trong heightForRowAtIndexPath, bạn sẽ lặp lại và vô hạn
Peter Lapisu

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

Mã của tôi:

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

Phương pháp này sẽ cho chiều cao hoàn hảo

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

Không sao chép nội dung từ nơi khác mà không có sự ghi nhận rõ ràng. Nó được xem là đạo văn. Xem stackoverflow.com/help/references ( stackoverflow.com/a/25158206/444991 ).
Matt

1

Swift 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()

Các dòng thú vị được sizeToFit()kết hợp với cài đặt frame.size.heightmức nổi tối đa, điều này sẽ nhường chỗ cho văn bản dài, nhưng sizeToFit()sẽ buộc nó chỉ sử dụng những thứ cần thiết, nhưng LUÔN LUÔN gọi nó sau khi đặt.frame.size.height .

Tôi khuyên bạn nên đặt .backgroundColormục đích gỡ lỗi, bằng cách này bạn có thể thấy khung được hiển thị cho từng trường hợp.


1
yourLabel.frame.heightlà tài sản duy nhất
Phil Hudson

2
yourLabel.frame.size. thong và yourLabel.frame.size.height cũng chỉ được đọc
CalZone

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

Vui lòng đặt các ràng buộc cho UILable trong bảng phân cảnh bao gồm trên cùng bên trái phía dưới bên phải

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.