我有一个动态大小的单元格的表视图。这在iOS 8中运行良好,但在iOS 7中不支持。我需要实现tableView:heightForRowAtIndexPath,否则应用程序将在iOS 7中崩溃。如果我这样做,我将不得不计算单元格的高度。问题是,如果我实现这个方法,iOS 8会关注它,并且不再使用动态大小的单元魔法。有没有办法只为iOS 7客户端实现这个方法?
答案 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设计) )。这是我经过长夜研究后所做的事情:
我应用了本指南中的解决方案:Dynamic Table View Cell Height and Auto Layout。
由于UILabel要求iOS 7设备具有明确的宽度,因此我以编程方式"清除"适用于iOS 8的此设置。在我的扩展表视图单元格中:
- (void)awakeFromNib {
// Initialization code
if (IS_IOS_8_OR_LATER) {
self.descriptionLabel.preferredMaxLayoutWidth = 0;
}
}
我使用了指南中的RWLabel
建议。
我停用 return UITableViewAutomaticDimension;
。是启用还是禁用,可能取决于表视图单元格中的子视图和约束。尽量适合你的情况。
我将所有RWLabel的尾随空间的优先级更改为999(而不是1000)。这消除了不可满足的约束警告。
希望这些解决方案可以帮助某人。