iOS 7和iOS 8中的动态单元格高度 - 我是否只支持iOS 7中的heightForRowAtIndexPath?

时间:2015-01-14 20:15:02

标签: ios uitableview ios7 ios8 autolayout

我有一个动态大小的单元格的表视图。这在iOS 8中运行良好,但在iOS 7中不支持。我需要实现tableView:heightForRowAtIndexPath,否则应用程序将在iOS 7中崩溃。如果我这样做,我将不得不计算单元格的高度。问题是,如果我实现这个方法,iOS 8会关注它,并且不再使用动态大小的单元魔法。有没有办法只为iOS 7客户端实现这个方法?

3 个答案:

答案 0 :(得分:3)

之前我使用过类似的东西:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self dequeueReusableCellWithIdentifier:@"CellIdentifier"];

    // Stuff & Things

    [cell.contentView setNeedsLayout];
    [cell.contentView layoutIfNeeded];

    return [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
}

答案 1 :(得分:2)

来自iOS 8的新内部自动布局自调整单元无法神奇地反映回iOS 7.但这不是问题。如果您想要向后兼容iOS 7,那么,正如您所说,这意味着您将自己确定单元格高度,以便您可以从tableView:heightForRowAtIndexPath:返回正确的值。这就是我们在iOS 4,5,6和7中所做的。这仍然可以在iOS 8中运行(并且可能更快)。

所以我的建议是:只需为iOS 7编写代码。如果您在Objective-C中进行编码,可能有两组不同的代码(条件编译),甚至在Swift中你可以使用两个不同的类,这取决于我们发现自己的系统;但我认为这有点过头 - 这是代码维护的噩梦等待发生。

答案 2 :(得分:1)

调试日志中出现UIViewAlertForUnsatisfiableConstraints错误。

  

无法同时满足约束条件。可能至少以下列表中的一个约束是您不想要的约束。试试这个:(1)看看每个约束,并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您正在查看您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints)("","",& #34;")

如果没有tableView:heightForRowAtIndexPath:,则单元格看起来很好。所以,我想在iOS 8中禁用它。@ batu在另一篇帖子中提供了一个解决方案:Implement heightForRowIndexPath: in iOS 7, but remove it in iOS 8 using compile-time macro。感谢@batu,解决方案就像这样简单:

#define IS_IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

-(CGFloat) tableView: (UITableView * ) tableView heightForRowAtIndexPath: (NSIndexPath * ) indexPath {
  if (IS_IOS_8_OR_LATER) {
    return UITableViewAutomaticDimension;
  }
  // Your iOS 7 code here.
}

然而 ,我的手机仍然存在iOS 6与iPhone 6的高度问题。原因似乎是UILabel的固定宽度(专为320pt设计) )。这是我经过长夜研究后所做的事情:

  1. 我应用了本指南中的解决方案:Dynamic Table View Cell Height and Auto Layout

  2. 由于UILabel要求iOS 7设备具有明确的宽度,因此我以编程方式"清除"适用于iOS 8的此设置。在我的扩展表视图单元格中:

    - (void)awakeFromNib {
        // Initialization code
        if (IS_IOS_8_OR_LATER) {
            self.descriptionLabel.preferredMaxLayoutWidth = 0;
        }
    }
    
  3. 我使用了指南中的RWLabel建议。

  4. 停用 return UITableViewAutomaticDimension;。是启用还是禁用,可能取决于表视图单元格中的子视图和约束。尽量适合你的情况。

  5. 我将所有RWLabel的尾随空间的优先级更改为999(而不是1000)。这消除了不可满足的约束警告。

  6. 希望这些解决方案可以帮助某人。