ปรับความสูงของ UILabel ขึ้นอยู่กับข้อความ


315

พิจารณาฉันมีข้อความต่อไปนี้ในUILabel(ข้อความไดนามิกบรรทัดยาว):

เนื่องจากกองทัพมนุษย์ต่างดาวมีจำนวนมากกว่าทีมผู้เล่นจะต้องใช้โลกหลังสงครามเพื่อผลประโยชน์ของพวกเขาเช่นการหาที่กำบังหลังถังขยะเสาเสารถยนต์ซากปรักหักพังและวัตถุอื่น ๆ

ฉันต้องการปรับขนาดUILabel'sความสูงเพื่อให้ข้อความสามารถพอดีได้ฉันใช้คุณสมบัติต่อไปนี้UILabelเพื่อทำให้ข้อความภายในมีการตัดคำ

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

โปรดแจ้งให้เราทราบหากฉันไม่ได้มุ่งหน้าไปในทิศทางที่ถูกต้อง ขอบคุณ


ดูเพิ่มเติมที่: stackoverflow.com/questions/406212/…
Richard Campbell

รุ่น Swift ด้านล่าง: stackoverflow.com/a/33945342/1634890
Juan Boero

คำตอบ:


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, คุณจะทำให้ข้อความมีความยืดหยุ่นได้อย่างไร?
quantumpotato

1
@quantumpotato 9999 เป็นเพียงตัวยึดสถานที่สำหรับพื้นที่สูงสุดที่ข้อความได้รับอนุญาตให้ใช้ คุณสามารถใช้หมายเลขใด ๆ ที่นั่นสำหรับ UI ของคุณ
PyjamaSam

9
หากคุณกำลังขนาดป้ายชื่อของคุณเช่นนี้คุณจะทำผิดมัน [label sizeToFit]คุณควรใช้
MariánČerný

5
อย่าลืมว่าsizeWithFontเลิกใช้แล้วใน iOS 7 stackoverflow.com/questions/18897896/…
attomos

7
เลิกใช้แล้ว;
msmq

242

คุณกำลังไปในทิศทางที่ถูกต้อง สิ่งที่คุณต้องทำคือ:

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

5
ขนาดที่พอดีคือสิ่งที่ฉันต้องการเพื่อให้ข้อความตัดคำยาวด้วย myUILabel.lineBreakMode = UILineBreakModeWordWrap; myUILabel.numberOfLines = 0;
Jack BeNimble

2
ทางออกที่ง่ายกว่าคำตอบที่ทำเครื่องหมายว่าถูกต้องและทำงานได้ดีเช่นกัน
memmons

4
@Inder Kumar Rathore - ฉันใช้มันเพื่อหลายบรรทัดตลอดเวลาดังนั้น numberOfLines = 0; ฉันเดาว่ามันขาดการตั้งค่าความกว้างที่กำหนดไว้ก่อน แต่ฉันคิดว่าสิ่งนี้ได้ทำกับ init ของ UILabel แล้ว
DonnaLea

@ ดอน .. ฉันไม่ชอบสิ่งที่คุณชอบ .. คุณกำลังพูดถึงเฟรมอยู่หรือเปล่า ??
Inder Kumar Rathore

@DonnaLea ขอบคุณมาก วิธีการที่เรียบง่ายของคุณในการแก้ปัญหาช่วยให้ฉันแก้ปัญหาของฉันได้เช่นกัน
นำทาง

44

ใน iOS 6 แอปเปิ้ลได้มีการเพิ่มคุณสมบัติให้กับUILabelที่ง่ายมากการปรับขนาดในแนวตั้งแบบไดนามิกของป้ายกำกับ: preferredMaxLayoutWidth

การใช้คุณสมบัตินี้ร่วมกับlineBreakMode = NSLineBreakByWordWrappingและเมธอดsizeToFitช่วยให้ปรับขนาดอินสแตนซ์ของ UILabel ได้อย่างง่ายดายเป็นความสูงที่รองรับข้อความทั้งหมด

อ้างจากเอกสาร iOS:

PreferredMaxLayoutWidth ความกว้างสูงสุดที่ต้องการ (เป็นจุด) สำหรับป้ายกำกับหลายบรรทัด

การอภิปราย คุณสมบัตินี้มีผลต่อขนาดของฉลากเมื่อมีการใช้ข้อ จำกัด โครงร่าง ระหว่างเลย์เอาต์ถ้าข้อความขยายเกินความกว้างที่ระบุโดยคุณสมบัตินี้ข้อความเพิ่มเติมจะถูกส่งไปยังหนึ่งหรือมากกว่าหนึ่งบรรทัดใหม่ซึ่งจะเป็นการเพิ่มความสูงของฉลาก

ตัวอย่าง:

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

ตรวจสอบงานนี้ได้อย่างสมบูรณ์แบบโดยไม่ต้องเพิ่มรหัสบรรทัดเดียว (ใช้ Autolayout)

ฉันสาธิตให้คุณตามความต้องการของคุณ ดาวน์โหลดจากลิงค์ด้านล่าง

ปรับขนาด UIView และ UILabel โดยอัตโนมัติ

คำแนะนำทีละขั้นตอน: -

ขั้นตอนที่ 1: -ตั้งค่าข้อ จำกัด เป็น UIView

1) ผู้นำ 2) ด้านบน 3) การต่อท้าย (จากมุมมองหลัก)

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 2: -กำหนดข้อ จำกัด เป็นป้ายกำกับ 1

1) ชั้นนำ 2) ด้านบน 3) การต่อท้าย (จาก superview)

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 3: -ตั้งค่าข้อ จำกัด เป็นป้ายกำกับ 2

1) นำหน้า 2) การต่อท้าย (จากการกำกับดูแล)

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 4: - ส่วนใหญ่ให้ botton แก่ UILabel จาก UIView

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 5: - (เป็นตัวเลือก) ตั้งค่าข้อ จำกัด เป็น UIButton

1) ชั้นนำ 2) ด้านล่าง 3) ส่วนท้าย 4) ความสูงคงที่ (จากมุมมองหลัก)

ป้อนคำอธิบายรูปภาพที่นี่

ผลลัพธ์: -

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: -ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าจำนวนบรรทัด = 0 ในคุณสมบัติป้ายกำกับ

ป้อนคำอธิบายรูปภาพที่นี่

ฉันหวังว่าข้อมูลนี้มากพอที่จะเข้าใจ Autoresize UIView ตามความสูงของ UILabel และ Autoresize UILabel ตามข้อความ


และถ้าคุณต้องการมีมุมมองบางอย่างภายใต้มุมมองพื้นหลังสีขาว การไม่ให้ความสูงนั้นจะแสดงเส้นสีแดงบางส่วนใน SB สำหรับ "ต้องการข้อ จำกัด สำหรับ: ตำแหน่ง Y หรือความสูง"
Bogdan Razvan

ต้องทำเครื่องหมายเป็นคำตอบที่ถูกต้อง นี่เป็นวิธีที่ถูกต้องกับ ib
Rana Tallal

@ SPQR3 ปัญหาคืออะไร มันช่วยให้ผู้คนจำนวนมากและทำงานได้ดี
Badal Shah

36

แทนที่จะทำสิ่งนี้โดยทางโปรแกรมคุณสามารถทำได้ใน Storyboard / XIB ขณะออกแบบ

  • ชุด UILabel ของจำนวนบรรทัดคุณสมบัติการ0ในแอตทริบิวต์การตรวจสอบ
  • จากนั้นตั้งค่าข้อจำกัดความกว้าง / (หรือ) นำหน้าและข้อ จำกัด ต่อท้ายตามข้อกำหนด
  • แล้วข้อ จำกัด สูงชุดที่มีค่าต่ำสุด สุดท้ายเลือกข้อ จำกัด ความสูงที่คุณเพิ่มและในการตรวจสอบขนาดหนึ่งต่อไปแอตทริบิวต์สารวัตรเปลี่ยนข้อ จำกัด ความสูงของความสัมพันธ์จากเท่ากับ - มากกว่า

อันนี้ใช้ได้กับ UILabel ที่ฝังอยู่ในเซลล์ xib ที่กำหนดเองใน UITableView
Gang Fang

ตามคำตอบของคุณฉันตั้งค่าความสูงคงที่กับป้ายกำกับของฉันและตั้งค่าลำดับความสำคัญเป็นต่ำ (250) และข้อผิดพลาดหายไป (ไม่จำเป็นต้องตั้งค่าเท่ากับ - มากกว่า)
ฮามิดเรซาอันซารี

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 ฉันควรจะเรียกวิธีนี้ได้อย่างไร
Homam

ตำแหน่งที่คุณต้องการคำนวณความสูงของป้ายกำกับจากนั้นเรียกใช้วิธีนี้ จากนั้นปรับความสูงของมุมมองตาราง ที่คุณมีความสูง tableview สำหรับแถวที่วิธีการดัชนี คำนวณข้อความป้ายกำกับแนวตั้งทั้งหมดตามที่คุณต้องการ
Vijay-Apple-Dev.blogspot.com

Vijay sizeWontFont จะถูกระบุไว้
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

ส่วนขยาย UILabel ตามคำตอบนี้สำหรับSwift 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 นี่คือส่วนขยายคลาสสำหรับ 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

วิธีที่ง่ายที่สุดและดีกว่าที่ใช้งานได้สำหรับฉันคือการจำกัดความสูงของป้ายกำกับและตั้งค่าลำดับความสำคัญเป็นต่ำ (250) ในกระดานเรื่องราว

ดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับการคำนวณความสูงและความกว้างของการเขียนโปรแกรมด้วยกระดานเรื่องราว


4

แนวทางของฉันในการคำนวณความสูงแบบไดนามิกของ 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

ห่อเพื่อฟังก์ชั่น:

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 Height โดยใช้ Objective-c:

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

และใช้ความสูงคุณจะได้รับความสูงของฉลากดังนี้:

neededSize.height

คำตอบที่ดีที่สุดในปัจจุบัน
Mike

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

ใน tableView: 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 as

itemTitle.text = @"diofgorigjveghnhkvjteinughntivugenvitugnvkejrfgnvkhv";

มันจะแสดงคำตอบที่สมบูรณ์แบบตามที่คุณต้องการ


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. ตั้งค่าข้อ จำกัด สำหรับ UILabel (ในกรณีของฉันฉันได้ด้านบนซ้ายและกว้างคงที่)
  2. กำหนดจำนวนบรรทัดเป็น 0ในตัวตรวจสอบแอตทริบิวต์
  3. ตั้งค่าตัวแบ่งบรรทัดเป็น WordWrapในตัวตรวจสอบแอตทริบิวต์

ปรับความสูงของ UILabel


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
คุณสามารถเพิ่มคำอธิบายวิธีแก้ปัญหาของ OP ได้อย่างไร

1
คุณไม่สามารถถาม UITableViewCell * cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; ใน heightForRowAtIndexPath คุณจะ ge t และ infinite loop
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

รหัสของฉัน:

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

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เรียกมันว่าหลังจากการตั้งค่า

ฉันขอแนะนำให้ตั้งค่า a .backgroundColorเพื่อวัตถุประสงค์ในการแก้ไขปัญหาด้วยวิธีนี้คุณสามารถดูเฟรมที่แสดงผลสำหรับแต่ละกรณี


1
yourLabel.frame.heightเป็นเพียงสถานที่ให้บริการ
Phil Hudson

2
yourLabel.frame.size.width และ yourLabel.frame.size.height มีการอ่านอย่างเดียว
CalZone

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

โปรดกำหนดข้อ จำกัด สำหรับ UILable ในกระดานเรื่องราวรวมถึงด้านบนซ้ายล่างขวา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.