วิธีคำนวณความกว้าง UILabel ตามความยาวข้อความ


142

ฉันต้องการแสดงภาพถัดจาก UILabel อย่างไรก็ตาม UILabel มีความยาวข้อความที่ผันแปรได้ดังนั้นฉันจึงไม่ทราบว่าจะวางรูปภาพไว้ที่ใด ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


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

[NSString sizeWithFont: forWidth: lineBreakMode:] ดีอย่างไร

คำถามนี้อาจมีคำตอบของคุณมันใช้ได้กับฉัน


สำหรับปี 2014 ฉันแก้ไขในเวอร์ชั่นใหม่นี้โดยอ้างอิงจากความคิดเห็นที่มีประโยชน์โดย Norbert ด้านล่าง! มันทำทุกอย่าง ไชโย

// yourLabel is your UILabel.

float widthIs = 
 [self.yourLabel.text
  boundingRectWithSize:self.yourLabel.frame.size                                           
  options:NSStringDrawingUsesLineFragmentOrigin
  attributes:@{ NSFontAttributeName:self.yourLabel.font }
  context:nil]
   .size.width;

NSLog(@"the width of yourLabel is %f", widthIs);

41
ข้อควรทราบ: สิ่งนี้เลิกใช้แล้วตั้งแต่ iOS7 วิธีที่ต้องการตอนนี้คือ:[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];
Norbert

17
คุณยังสามารถใช้คุณสมบัติ IntrinsicContentSize ฉันไม่ค่อยได้เข้าสู่ Objective-c แต่มันควรจะเป็นแบบนี้: self.yourLabel.intrinsicContentSize สิ่งนี้จะทำให้คุณมีขนาดของเนื้อหาฉลากดังนั้นคุณจะได้ความกว้างจากตรงนั้น
บอริส

1
ใช้yourLabel.intrinsicContentSize.widthงานได้ดีตรวจสอบคำตอบด้านล่าง
denis_lor

156

yourLabel.intrinsicContentSize.widthสำหรับObjective-C / Swift


ไม่ทำงานสำหรับฉันมันไม่ได้คำนวณความสูงของความกว้างของฉลากบนพื้นฐานของข้อความของพวกเขา
Chandni

1
ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันด้วยตัวอักษรที่กำหนดเองเช่นกัน!
fl034

1
คำตอบที่สมบูรณ์แบบสำหรับการรับความกว้างของป้ายกำกับแบบไดนามิก
Chetan

52

อย่างรวดเร็ว

 yourLabel.intrinsicContentSize().width 

3
คำตอบนี้ใช้ได้เฉพาะสำหรับมุมมองที่ได้รับการจัดวาง
rommex

33

คำตอบที่เลือกนั้นถูกต้องสำหรับ iOS 6 และต่ำกว่า

ใน iOS 7 sizeWithFont:constrainedToSize:lineBreakMode:ได้รับการเลิกใช้ boundingRectWithSize:options:attributes:context:ก็จะแนะนำตอนนี้คุณใช้

CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
                                                    options:<NSStringDrawingOptions>
                                                 attributes:@{
                                                    NSFontAttributeName: yourString.font
                                                    AnyOtherAttributes: valuesForAttributes
                                                 }
                                                    context:(NSStringDrawingContext *)];

โปรดทราบว่าค่าตอบแทนเป็นไม่ได้เป็นCGRect CGSizeหวังว่าจะเป็นความช่วยเหลือจากผู้ใช้ใน iOS 7


12

ใน iOS8 sizeWontFont เลิกใช้แล้วโปรดอ้างอิง

CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];

คุณสามารถเพิ่มคุณสมบัติทั้งหมดที่คุณต้องการใน sizeWithAttributes คุณลักษณะอื่น ๆ ที่คุณสามารถตั้งค่า:

- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName

และอื่น ๆ แต่บางทีคุณอาจไม่ต้องการคนอื่น


10

Swift 4 คำตอบที่ใช้ข้อ จำกัด

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet

Swift 5 คำตอบที่ใช้ข้อ จำกัด

label.text = "Hello World"

var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(withAttributes: [NSAttributedString.Key.font: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet

1
ที่ดี! สะดวกสำหรับการคำนวณความกว้างของ UIButton ตามข้อความโดยที่ intrinsicContentSize.width ทำงานได้ไม่ถูกต้องเสมอไป
Nomnom

8
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;

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

คำตอบนี้บอกวิธีปรับขนาดฉลากตามข้อความ ปัญหานี้คืออะไร?
น้ำผึ้ง Lakhani

2

นี่คือสิ่งที่ฉันคิดขึ้นหลังจากใช้หลักการไม่กี่ข้อในโพสต์ SO อื่นรวมถึงลิงค์ของ Aaron:

    AnnotationPin *myAnnotation = (AnnotationPin *)annotation;

    self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
    self.backgroundColor = [UIColor greenColor];
    self.frame = CGRectMake(0,0,30,30);
    imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
    imageView.frame = CGRectMake(3,3,20,20);
    imageView.layer.masksToBounds = NO;
    [self addSubview:imageView];
    [imageView release];

    CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
    CGRect newFrame = self.frame;
    newFrame.size.height = titleSize.height + 12;
    newFrame.size.width = titleSize.width + 32;
    self.frame = newFrame;
    self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
    self.layer.borderWidth = 3.0;

    UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
    infoLabel.text = myAnnotation.title;
    infoLabel.backgroundColor = [UIColor clearColor];
    infoLabel.textColor = [UIColor blackColor];
    infoLabel.textAlignment = UITextAlignmentCenter;
    infoLabel.font = [UIFont systemFontOfSize:12];

    [self addSubview:infoLabel];
    [infoLabel release];

ในตัวอย่างนี้ฉันกำลังเพิ่มพินที่กำหนดเองไปยังคลาส MKAnnotation ที่ปรับขนาด UILabel ตามขนาดตัวอักษร นอกจากนี้ยังเพิ่มรูปภาพที่ด้านซ้ายของมุมมองดังนั้นคุณจะเห็นรหัสบางส่วนที่จัดการระยะห่างที่เหมาะสมเพื่อจัดการภาพและการขยาย

กุญแจสำคัญคือการใช้CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];แล้วกำหนดมิติของมุมมองใหม่ คุณสามารถใช้ตรรกะนี้กับมุมมองใด ๆ

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

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