Ios systemLayoutSizeFittingSize:和大小类的意外行为

Ios systemLayoutSizeFittingSize:和大小类的意外行为,ios,objective-c,autolayout,size-classes,Ios,Objective C,Autolayout,Size Classes,我遇到了一些与动态调整单元格大小、自动布局和大小类相关的奇怪问题。我的测试项目完全基于Ray的教程。看起来唯一的区别是UILabels对于大小类的字体大小。 当我在某个大小类中为标签设置另一个字体大小时,高度计算错误。我制作了一个截图来说明这一点 W单元格高度计算错误: 使用正确的单元格高度计算: 此外,我还推到了github 编辑: ViewController.m CustomLabel.m 由于您已经在使用自动布局,我建议您也利用自调整单元格大小。您不需要任何行高计算,因为iOS可以根据U

我遇到了一些与动态调整单元格大小、自动布局和大小类相关的奇怪问题。我的测试项目完全基于Ray的教程。看起来唯一的区别是UILabels对于大小类的字体大小。 当我在某个大小类中为标签设置另一个字体大小时,高度计算错误。我制作了一个截图来说明这一点

W单元格高度计算错误:

使用正确的单元格高度计算:

此外,我还推到了github

编辑:

ViewController.m

CustomLabel.m


由于您已经在使用自动布局,我建议您也利用自调整单元格大小。您不需要任何行高计算,因为iOS可以根据UILabel高度自动调整单元格高度

将自动布局约束添加到contentView的UILabel。这将导致单元格根据标签的内容调整其contentView高度。 启用行高度估计。 self.tableView.rowHeight=UITableViewAutomaticDimension; self.tableView.estimateDroweight=44.0


有关详细信息,请参阅his中的详细演练,以在UITableView中使用自动布局实现动态单元格布局和可变行高。

仅供参考:给定的web链接已在我的国家/地区被阻止。将代码部分和图像粘贴到此处,而不是链接和链接说明。@refdev感谢您的建议。我已经编辑了我的问题添加代码部分。不幸的是,由于stackoverflow的声誉系统,我无法直接粘贴图像。@refdev感谢您的编辑!谢谢你的回复。据我所知,这种方法只能在iOS 8中使用
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  return [self heightForCellAtIndexPath:indexPath];
}
- (CGFloat)heightForCellAtIndexPath:(NSIndexPath *)indexPath {
  static CustomTableViewCell *sizingCell = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kBasicCell];
  });
  [self configurateCell:sizingCell atIndexPath:indexPath];
  return [self calculateHeightForCell:sizingCell];
}

- (CGFloat)calculateHeightForCell:(CustomTableViewCell *)cell {
  cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(self.tableView.frame), CGRectGetHeight(cell.bounds));

  [cell setNeedsLayout];
  [cell layoutIfNeeded];

  CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
  return size.height +1.0f;
} 
- (void)setBounds:(CGRect)bounds {
  [super setBounds:bounds];

  if (self.numberOfLines == 0 && bounds.size.width != self.preferredMaxLayoutWidth) {
    self.preferredMaxLayoutWidth = self.bounds.size.width;
    [self setNeedsUpdateConstraints];
  }