动态UILabel大小iOS 7问题

时间:2015-01-05 21:41:38

标签: ios objective-c iphone uitableview

我尝试根据文字高度动态调整标签大小。 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结果(右)

enter image description here enter image description here 我没有在我的代码中为UILabel设置任何高度约束,而是试图让约束调整我的垂直高度。如果有人对如何在iOS 7.1上正常工作有一些意见,我会非常感激。

将约束移动到setupViews会产生:( iOS 7.1顶级iOS 8底部)

enter image description here

enter image description here

2 个答案:

答案 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?