UILabel sizeToFit无法正常工作。使用setNumberOfLines不起作用。需要可变高度功能才能工作

时间:2013-02-07 12:55:58

标签: iphone xcode storyboard

我试图通过UILabel显示可变高度的文本量。
我通过将Xcode的故事板和编码直接组合到实现文件中来设置所有内容。

以下是代码:

CGRect labelFrame = CGRectMake(20, 20, 280, 800);
descriptionLabel.frame = labelFrame;
NSString *description = self.spell[@"description"];
descriptionLabel.text = description;
[descriptionLabel setNumberOfLines:0];
[descriptionLabel sizeToFit];

我尝试过更改wordwrap功能并尝试使用很多不同的设置,但无济于事。

故事板中是否需要特定的内容?
我的view->标签的结构是否重要?
我有它,以便标签在视图中(占据整个屏幕)。

6 个答案:

答案 0 :(得分:10)

您无需手动计算高度。对于可变高度,在调用sizeToFit之前将标签的高度设置为0,如下所示。

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 280, 0)];
label.numberOfLines = 0;
label.text = @"Some long piece of text...";

[label sizeToFit];

答案 1 :(得分:7)

我正在使用SWIFT,我遇到了同样的问题。我在添加 layoutIfNeeded() 后修复了它。我的代码如下:

self.MyLabel.sizeToFit()
self.MyLabel.layoutIfNeeded()

答案 2 :(得分:1)

以下是我的任何问题的解决方案,例如你的(动态高度):

NSString *description = @"Some text";

CGSize dynamicSize = [[description sizeWithFont:[UIFont fontWithName:@"FONT_NAME" size:14] constrainedToSize:CGSizeMake(300, 10000)]; //the width should be the one you need and just put in a very big height so that anything you would put in here would fit
//dynamicSize is now the exact size you will need, with the fixed width and the height just enough so that all the text will fit.

UILabel *someLabel = [[UILabel alloc] initWithFrame:CGRectMake:(0, 0, dynamicSize.width, dynamicSize.height)];
someLabel.font = YOUR_FONT;
someLabel.numberOfRows = 10 //You should calculate how many rows you need by dividing dynamicSize.height to the height of one row (should also take into account the padding that your UILabel will put between rows

在我看来,这是确定所需高度最安全的方法。另外,据我所知,调用sizeToFit不会改变它的大小,如果它已经足够容纳所有文本了。(不会让它变小......如果它需要更大但是它不会添加更多行)

答案 3 :(得分:0)

我尝试创造同样的东西,它对我来说完全没问题。 (我的应用程序中没有故事板,但我认为它不会影响任何内容。)

UILabel *bioLabel = [[UILabel alloc] init];
CGRect labelFrame = CGRectMake(0, 100, 320, 500);
bioLabel.frame = labelFrame;
NSString *bio =@"YOUR_TEXT_HERE";
bioLabel.text = description;
[bioLabel setNumberOfLines:0];
[bioLabel sizeToFit];
[self.view addSubview:bioLabel];

答案 4 :(得分:0)

看起来你没有设置lineBreakMode。

我从stackoverflow的方式获得了一些代码,并把它放到一个类别中,你可以在这里:http://www.notthepainter.com/multi-line-uilabel/

但是如果你只是想要代码,那么它就是:

@interface UILabel (BPExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth;
@end
 
@implementation UILabel (EnkiExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth
{
    if (fixedWidth < 0) {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, 0);
    } else {
        self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0);
    }
    self.lineBreakMode = UILineBreakModeWordWrap;
    self.numberOfLines = 0;
    [self sizeToFit];
}
@end

你这样称呼它:

helpLabel_.text = @"You need to cut the blue wire and ground the red wire. Do not cut the red wire and ground the blue wire, that would be bad.";
[helpLabel_ sizeToFitFixedWidth: desiredWidth ];

答案 5 :(得分:0)

我也有麻烦,我的代码是这样的:

    TeacherTagBtn *tagBtn = [[TeacherTagBtn alloc] init];
    [tagBtn setTitle:tagModel.values forState:UIControlStateNormal];

    [tagBtn.titleLabel sizeToFit];

你知道的UIbutton的TeacherTagBtn子类! 那么我想得到这样的标签宽度:

tempBtn.titleLabel.frame.size.width

最后,我失败了。宽度为0。 像这样:

    TeacherTagBtn *tagBtn = [[TeacherTagBtn alloc] initWithFrame:CGRectMake(0, 0, 100, 16)];
    [tagBtn setTitle:tagModel.values forState:UIControlStateNormal];
    [tagBtn.titleLabel sizeToFit];

只添加框架,它完美无缺!