systemLayoutSizeFittingSize:和size类的意外行为

时间:2015-05-19 08:05:02

标签: ios objective-c autolayout size-classes


我有一些与动态大小的单元格,自动布局和大小类相关的奇怪问题。我的测试项目完全基于Ray的教程。似乎唯一的区别是UILabels的大小类字体大小。 当我在某个大小类中为label设置另一个字体大小时,高度计算是错误的。我已经制作了截图来说明它。

错误的单元格高度计算:

enter image description here

使用正确的细胞高度计算:

enter image description here

此外,我已将test project推送到github。

编辑:

ViewController.m

- (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;
} 

CustomLabel.m

- (void)setBounds:(CGRect)bounds {
  [super setBounds:bounds];

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

1 个答案:

答案 0 :(得分:0)

由于您已经在使用自动布局,我建议您也使用自动调整大小的单元格。您不需要任何行高计算,因为iOS可以根据 <table border="0" width="600" cellpadding="0" cellspacing="0" class="container" style="width:600px;max-width:600px"> <tr> <td class="container-padding content" align="left" style="padding-left:24px;padding-right:24px;padding-bottom:12px;background-color:#ffffff;font-family: Arial, sans-serif, 'Open Sans';"> <table cellspacing="0" cellpadding="0" border="0" width="50%" align="left" style="padding-right:15px;"> <tr> <td width="50%" style="width:50%"><a href="http://www.engraversnetwork.com/files/placeholder.jpg"> <img src="http://www.engraversnetwork.com/files/placeholder.jpg" width="350" height="100" alt=""> </a></td> </tr> </table> <div class="title" style="font-family: Arial, sans-serif, 'Open Sans';font-size:24px;font-weight:normal;color:#C33734"><a href="*|RSSITEM:URL|*" style="text-decoration:none;">Lorem ipsum Duis dolor sit.</a></div> <div class="author" style="padding-top:2px;padding-bottom:5px;font-size:18px;color:#5584C4"> Lorem ipsum Officia aliquip quis. </div> <div class="date" style="padding-top:2px;padding-bottom:5px;font-size:16px;color:#86BE3C;"> 5/31/2015 </div> <br /> <div class="body-text" style="font-family: Arial, sans-serif, 'Open Sans';font-size:14px;line-height:20px;text-align:left;color:#333333;padding-bottom:8px;padding-top:8px;">Lorem ipsum Ex incididunt cillum enim sed enim consectetur culpa incididunt enim ut ut tempor mollit adipisicing irure anim in occaecat aute officia magna dolor do tempor occaecat et aliqua. </div></td> </tr> </table> 高度自动调整单元格的高度。

  1. 将自动布局约束添加到contentView的UILabel。这将导致单元格根据标签的内容调整其UILabel高度。
  2. 启用行高估计。
      

    self.tableView.rowHeight = UITableViewAutomaticDimension;    self.tableView.estimatedRowHeight = 44.0;

  3. 有关详细信息,请参阅smileyborganswer在UITableView中使用自动布局进行动态单元格布局的详细演练。可变行高