我尝试根据文字高度动态调整标签大小。 UILabel的高度可以从0到多行不等。我已经找到了解决这个问题的解决方案,这个问题在iOS 8上运行良好但在iOS 7.1上失败了,我也试图支持它。
此项目中未使用Autolayout,并且所有约束都以编程方式完成。
代码如下:
// TableDelegate.m
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 85.0f;
}
// CustomTableViewCell.m
-(UILabel *)commentTextLabel
{
if(!_commentTextLabel)
{
_commentTextLabel = [UILabel new];
_commentTextLabel.numberOfLines = 0;
_commentTextLabel.translatesAutoresizingMaskIntoConstraints = NO;
}
return _commentTextLabel;
}
-(void)setupViews
{
[self.contentView addSubview:self.profilePictureView];
[self.contentView addSubview:self.userName];
[self.contentView addSubview:self.timePublishedLabel];
[self.contentView addSubview:self.commentTextLabel];
[self.contentView addSubview:self.seeMoreButton];
self.backgroundColor = [UIColor salooteInputTextBg];
self.contentView.backgroundColor = [UIColor salooteInputTextBg];
NSDictionary *views = @
{
@"picture" : self.profilePictureView,
@"userName" : self.userName,
@"timePublished" : self.timePublishedLabel,
@"text" : self.commentTextLabel,
@"seeMore" : self.seeMoreButton
};
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[picture(38)]-5-[userName]-5-[timePublished]-5-|" options:0 metrics:nil views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[picture]-5-[text]-5-|" options:0 metrics:nil views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[seeMore]-5-|" options:0 metrics:nil views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-5-[userName]-5-[text]-5-[seeMore]-5-|" options:0 metrics:nil views:views]];
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-5-[picture(38)]" options:0 metrics:nil views:views]];
}
-(void)updateConstraints
{
[super updateConstraints];
}
iOS 8结果(左)iOS 7.1结果(右)
我没有在我的代码中为UILabel设置任何高度约束,而是试图让约束调整我的垂直高度。如果有人对如何在iOS 7.1上正常工作有一些意见,我会非常感激。
将约束移动到setupViews会产生:( iOS 7.1顶级iOS 8底部)
答案 0 :(得分:0)
在我看来,你没有向commentTextLabel
添加垂直约束?你只有这个:
//Comment text
[self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[picture]-5-[text]-0-|" options:0 metrics:nil views:views]];
尝试设置垂直约束 - 很可能你的约束错误不足,iOS 8猜测高度比iOS 7更好。另外,如果你要为视图添加约束,你不应该必须在getter中调用sizeToFit
。
此项目中未使用Autolayout,并且所有约束都以编程方式完成。
即使您只是以编程方式添加约束,您仍然在使用Autolayout。 :)
回复编辑
您的垂直高度限制不足 - 您只指定了commentTextLabel
的高度,但没有指定其y坐标的高度。请记住,Autolayout的主要目标是提供一组完整的约束,以便iOS可以针对视图的x,y,宽度和高度进行计算。
我认为你的约束总体上已被搞砸了。 :)尝试将这些规则添加到内容视图中(我只使用5表示任何填充):
H:|-5-[picture(38)]-5-[username]-5-[timePublished]-5-|
H:[picture]-5-[text]-5-|
H:|-5-[seeMore]-5-|
V:|-5-[username]-5-[text]-5-[seeMore]-5-|
V:|-5-[picture(38)]
另外,在setupViews
中添加约束 - 您只需添加一次约束,并且只需在updateConstraints
中修改它们。我认为每次调用updateConstraints
时都会调用layoutSubviews
,因此每次刷新单元格的布局时,您的约束都会被添加。
回复编辑
也必须设置标签的自动换行样式。在commentTextLabel
内,添加
_commentTextLabel.lineBreakMode = NSLineBreakByWordWrapping;
如果你想要一个动态高度的UILabel,请务必将其与numberOfLines = 0
一起设置。
您还需要通过设置标签的alignment
属性来右对齐seeMore标签(它占据单元格的整个宽度减去填充)。
现在尝试提供更大的虚拟高度 - 可能是150或200而不是85,这样我们就能看到所有元素。
对于timePublished标签,我忘了指出以下垂直约束:
V:|-5-[timePublished]
答案 1 :(得分:0)
我发现,轻松支持iOS7和iOS8的唯一方法是使用屏幕外原型自行完成每个单元的高度计算。以下是关于这些问题的优秀文章。我无法将iOS8的自动布局高度计算与iOS7的手动高度估算混合在一个代码库中。
Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
我使用此方法的唯一问题是当我使用大小类来更改单元格字体大小,因此我可以在iPad等上使用更大的字体...此问题在此处讨论:
Offscreen UITableViewCells (for size calculations) not respecting size class?