具有固定宽度和灵活高度的UILabel

7

在详细视图控制器中我有一个 UILabel,根据所选的表格行内容会改变。我的问题是,我想让 UILabel 固定宽度并根据文本内容动态调整高度。我该怎么做?(对我的错误表示抱歉,但我不是英语母语者)

2个回答

8

我喜欢通过子类化 UILabel 来实现该功能。

AutosizingLabel.h

#import <UIKit/UIKit.h>


@interface AutosizingLabel : UILabel {
    double minHeight;
}

@property (nonatomic) double minHeight;

- (void)calculateSize;

@end    

AutosizingLabel.m

#define MIN_HEIGHT 10.0f

#import "AutosizingLabel.h"

@implementation AutosizingLabel

@synthesize minHeight;

- (id)init {
    if ([super init]) {
        self.minHeight = MIN_HEIGHT;
    }

    return self;
}

- (void)calculateSize {
    CGSize constraint = CGSizeMake(self.frame.size.width, 20000.0f);
    CGSize size = [self.text sizeWithFont:self.font constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];    

    [self setLineBreakMode:UILineBreakModeWordWrap];
    [self setAdjustsFontSizeToFitWidth:NO];
    [self setNumberOfLines:0];
    [self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, MAX(size.height, MIN_HEIGHT))];

}

- (void)setText:(NSString *)text {  
    [super setText:text];

    [self calculateSize];
}

- (void)setFont:(UIFont *)font {
    [super setFont:font];

    [self calculateSize];
}

@end

要使用此功能,请在项目中导入/创建.h和.m文件。如果您正在使用代码创建UILabel,则代码应如下所示:

#import "AutosizingLabel.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    AutosizingLabel *label = [[AutosizingLabel alloc] init];
    label.text = @"Some text here";
    [self.view addSubview:label];
}

如果您正在使用XIB,您可以选择任何UILabel,然后单击右侧边栏中的Identity Inspector将其类设置为AutosizingLabel。在任一情况下,设置.text属性将自动更新标签的大小。


谢谢。那么我该如何在详细视图控制器中使用这个子类,以便为我的UILabel实现动态高度? - Gianclè Monna
从iOS 7开始,将UILineBreakModeWordWrap更改为NSLineBreakByWordWrapping。 - Stas Zhukovskiy
@stas - 是的,但实际上,现在我们有了NSAttributedString,整个calc函数应该被重写以支持它。如果我有时间,我会更新。 - Josh Hudnall
是的,@JoshHudnall,在我按下回车键的时候我也想到了这一点,因为sizeWithFont:constrainedToSize:lineBreakMode:也已经被弃用了。 - Stas Zhukovskiy

-3

你可以做到...这里是代码。

UILabel *yourlabel = [[UILabel alloc] initWithFrame:CGRectMake(x, y, 100, sizeToFit)];
yourlabel.numberOfLines = 0;

如有任何疑问,请在评论区留言。


我无法将sizeToFit用作CGRect高度的值,Xcode不允许我这样做。它显示这是一个“未声明的标识符”。 - Gianclè Monna
请检查这个链接,我认为它可以解决你的问题。http://basheerad.blogspot.com/2011/12/dynamic-width-and-height-for-uilabel-in.html - jamil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接