iOS: 使用sizeWithFont:constrainedToSize:lineBreakMode:无法动态计算UILabel的高度

4

我想让我的UILabel根据内容自适应高度,以便在横竖屏模式下其他标签的布局看起来正确。

在竖屏模式下,我的文本会换到第二行,在横屏模式下则不会。因此,当使用sizeWithFont:constrainedToSize:lineBreakMode:时,旋转两种方式时我得到的高度相同,但我认为当文本为2行时它应该是一个更大的数字。

我该如何获取我的UILabel在有两行或更多文本时(竖屏模式),并在横屏模式下获取新的一行高度?

我猜我还不理解如何使动态高度工作...

UILabel *itemTitle = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, top, screen.size.width - 20, 200.0f)];
itemTitle.text = self.newsAsset.title;
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];

// Set the height
CGSize maximumLabelSize = CGSizeMake(300,9999);
CGSize titleSize = [itemTitle.text sizeWithFont:itemTitle.font constrainedToSize:maximumLabelSize lineBreakMode:itemTitle.lineBreakMode];

NSLog(@"Height: %.f  Width: %.f", titleSize.height, titleSize.width);

//Adjust the label the the new height
CGRect newFrame = itemTitle.frame;
newFrame.size.height = titleSize.height;
itemTitle.frame = newFrame;

// Add them!
[headerView addSubview:itemTitle];
[itemTitle release];

top += titleSize.height;

你作为constrainedToSize:参数传递了什么?能展示一些代码吗? - mvds
2个回答

3

将设置maximumLabelSize的行改为

CGSize maximumLabelSize = CGSizeMake(headerView.bounds.size.width, CGFLOAT_MAX);

你怎么在不设置硬编码的情况下实现这个功能? - quantumpotato
4
CGSize maximumLabelSize = CGSizeMake(headerView.frame.size.width, CGFLOAT_MAX); 的意思是创建一个 CGSize 类型的变量 maximumLabelSize,宽度为 headerView 的宽度,高度默认为无限大(CGFLOAT_MAX)。您可以根据需要更改高度值。 - Jochen

0
在您现有的代码中,无论是横向还是纵向,都会得到相同的宽度和高度,因为您总是将宽度设置为300传递给sizeWithFont方法。如果您使其动态化,也许sizeWithFont的结果也会随之动态变化。

好的,那么我该怎么做才能修复这个问题呢? - Nic Hubbard
也许在分配/初始化行中使用screen.size.width - 20代替300更好?我还会NSLog()任何可能感兴趣的内容,例如NSLog(@"屏幕尺寸:%@",NSStringFromCGSize(screen.size)); - mvds
(只是为了确保屏幕方向更改实际上会导致此时翻转的屏幕大小) - mvds

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