14

我在过去的 QA 中搜索过解决方案,但找不到合适的解决方案。
有谁知道如何UILabel动态调整大小以适应文本长度?
我已经上传了我不想要的(第一行)和我想要的(第二行)的屏幕截图。
我将不胜感激任何线索、建议或代码示例。谢谢你。在此处输入图像描述

4

8 回答 8

13

您正在搜索的是 UILabel 方法sizeToFit

我可以尝试向您解释,但了解如何使用 UILabel 的最佳答案是:https ://stackoverflow.com/a/1054681/666479

于 2013-06-01T01:57:24.463 回答
6

Xcode 8 和 iOS 10

使用自动布局很容易做到这一点。无需在代码中做任何事情。

在此处输入图像描述

使用自动布局

使用自动布局仅固定每个标签的顶部和左侧边缘不要为宽度和高度添加约束。视图的内在内容大小将负责这一点。

在此处输入图像描述

以下是约束的样子:

在此处输入图像描述

代码

代码没有什么特别之处。无需使用sizeToFit或类似的东西。

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var labelOne: UILabel!
    @IBOutlet weak var labelTwo: UILabel!
    @IBOutlet weak var labelThree: UILabel!

    @IBAction func changeTextButtonTapped(_ sender: UIButton) {

        labelOne.text = "David"
        labelTwo.text = "met"
        labelThree.text = "her"
    }
}

笔记

  • 这个答案已经过 Xcode 8、iOS 10 和 Swift 3 的重新测试。
  • 如果您想要多行调整大小,请参阅我的其他答案。
  • 感谢这个答案让我走上了正确的轨道。
于 2016-04-01T06:24:29.420 回答
3

使用这个扩展UILabel类:

//
//  UILabelExtended.h

//
//  Created by Prateek on 6/18/11.



#import <Foundation/Foundation.h>

/*  **********************************************************************************************
        This class inherit the class UILabel and extend the features of UILabel. 
    ********************************************************************************************** */
@interface UILabelExtended : UILabel {
   __unsafe_unretained id  customDelegate;
    id  objectInfo;
    SEL selector;
}

@property (nonatomic,assign) SEL selector;;
@property (nonatomic,assign) id  customDelegate;
@property (nonatomic,retain) id  objectInfo;
@end

@interface UILabel(UILabelCategory)
- (void)setHeightOfLabel;
- (void)setWidthOfLabel;
- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight;
- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth ;
@end

UILabelExtended.m

//
//  Created by Prateek on 6/18/11.

//

#import "UILabelExtended.h"


@implementation UILabelExtended
@synthesize selector,customDelegate, objectInfo;

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(self.selector)
        if([self.customDelegate respondsToSelector:self.selector]) {
            [self.customDelegate performSelector:self.selector withObject:self];
            return;
        }
}

- (void)dealloc {

    self.customDelegate = nil;
    self.selector = NULL;
    self.objectInfo = nil;
}
@end


@implementation UILabel(UILabelCategory)

- (void)setHeightOfLabel {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, 99999) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.height = height;
    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}


- (void)setWidthOfLabel {
    UILabel* label = self;

        //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
        //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.width = width+5;
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}

- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, maxHeight) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;

    if([label.text length] > 0) {
        if (height > maxHeight) {
            frame.size.height = maxHeight;
        }
        else {
            frame.size.height = height;
        }

    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}

- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth  {
    UILabel* label = self;

    //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        if (width > maxWidth) {
            frame.size.width = maxWidth;
        }
        else {
            frame.size.width = width;
        }
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}
@end

使用方法: 1) 设置文本UILabel 2)[yourLBLObj setHeightOfLabel];或者[yourLBLObj setWidthOfLabel]; 它会根据文本自动设置高度或宽度。

于 2013-06-01T04:50:21.797 回答
3

你可以简单地计算UILabel字符串大小的宽度,试试这个简单的代码来设置UILabel大小

   // Single line, no wrapping;
    CGSize expectedLabelSize = [string sizeWithFont:yourFont];
 //  you get width,height in expectedLabelSize;
//expectedLabelSize.width,expectedLabelSize.height
于 2013-06-01T05:00:24.880 回答
1

尝试这个

        NSString *text1 = [NSString stringWithFormat:@"%@",commentText];
        CGSize constraint1 = CGSizeMake(280, 2000);
        CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap];

        UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] ;
        lblComment.lineBreakMode = UILineBreakModeWordWrap;
        lblComment.numberOfLines = size1.height/15;
        [lblComment setFont:[UIFont systemFontOfSize:12]];
        lblComment.text = text1;
        lblComment.tag = shareObjC.userId;
            [lblComment setNeedsDisplay]
于 2013-06-01T07:06:16.930 回答
0

您可以使用这段代码来计算标签宽度并设置它

   CGSize expectedLabelSize = [name sizeWithFont:yourfont constrainedToSize:maximumLabelSize]; 

// 您可以从 expectedLabelSize 中获取宽度宽度高度并进行相应设置

于 2013-06-01T04:48:15.430 回答
0

只需输入 2 行代码

lbl1.numberOfLines = 0
    lbl1.sizeToFit()

它将根据其内容管理标签宽度

希望它可以帮助别人:)

于 2018-05-21T19:02:20.803 回答
0

目前我正在开发 IOS-8,我对@Suragch 的答案做了一些小改动(需要使用自动布局来完成这项工作)

以下是结果中的步骤和屏幕截图:

  1. 将文本视图放在 UIView 内,而不是直接放在情节提要的内容视图内
  2. 从情节提要禁用文本视图的滚动
  3. 添加前导和顶部约束,因为我已在下面的屏幕截图中添加到视图(尾随约束是可选的,但我已添加)

无需在 swift 中添加代码,这可以在故事板本身中完成。

结果 :在此处输入图像描述

于 2017-02-17T12:02:36.843 回答