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

Dynamic cell height in iOS 7 and iOS 8 - can I only support heightForRowAtIndexPath in iOS 7?

我有一个 table 视图,其中包含动态调整大小的单元格。这在 iOS 8 中非常有效,但在 iOS 7 中不受支持。我需要实施 tableView:heightForRowAtIndexPath 否则应用程序将在 iOS 7 中崩溃。如果我这样做,我将不得不计算单元格的高度。问题是,如果我实施此方法,iOS 8 会注意它并且不再执行其动态大小的单元格魔术。有没有办法只对 iOS 7 个客户端实施此方法?

我以前用过类似的东西:

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

来自 iOS 8 的新内部自动布局自适应单元格无法神奇地反映回 iOS 7。但这不是问题。如果你想向后兼容 iOS 7,那么,正如你所说的那样,这意味着你将自己确定单元格高度,这样你就可以 return 来自 [=10] 的正确值=].这就是我们在 iOS 4、5、6 和 7 中所做的。这在 iOS 8 中仍然有效(而且可能更快)。

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

我在调试日志中收到 UIViewAlertForUnsatisfiableConstraints 错误。

Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "", "", "" )

如果没有 tableView:heightForRowAtIndexPath:,单元格看起来没问题。所以,我想在iOS8中禁用它。@batu在另一个post中给出了解决方案: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.
}

但是,我的手机在iOS8和iPhone6的高度仍然有问题。原因似乎是 UILabel 的固定宽度(专为 320pt 而设计)。这是我经过一夜的研究后所做的:

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

  2. 由于 UILabel 需要 iOS 7 设备的显式宽度,我以编程方式 "clear" iOS 8 的此设置。在我的扩展 table查看单元格:

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

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

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

希望这些解决方案对某人有所帮助。