我已经使用
为iOS 8实现了自动动态tableview单元格高度self.tableView.rowHeight = UITableViewAutomaticDimension;
对于不支持自动动态单元格高度的iOS 8之前的版本,我重写了heightForRowAtIndexPath方法。
这与我的做法类似:Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
问题是如何为iOS 8编写使用自动单元格高度的代码,但是为早期iOS版本覆盖heightForRowAtIndexPath。 仅当iOS版本小于8时,我才会喜欢我的自定义heightForRowAtIndexPath方法。 有关如何做到这一点的任何建议吗?
答案 0 :(得分:19)
一种解决方案是覆盖视图控制器中的respondsToSelector:
方法。在检查NO
方法时,让它在iOS 8下返回heightForRowAtIndexPath:
。
- (BOOL)respondsToSelector:(SEL)selector {
static BOOL useSelector;
static dispatch_once_t predicate = 0;
dispatch_once(&predicate, ^{
useSelector = [[UIDevice currentDevice].systemVersion floatValue] < 8.0 ? YES : NO;
});
if (selector == @selector(tableView:heightForRowAtIndexPath:)) {
return useSelector;
}
return [super respondsToSelector:selector];
}
这样,当表视图进行如下调用时:
if ([self.delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]) {
}
您的代码将在iOS 8或更高版本下返回NO
,在iOS 7或更早版本下返回YES
。
答案 1 :(得分:1)
我找到了一个简单的解决方案。 声明此宏以识别用户是否具有iOS 8.0或更高版本:
#define IS_IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
然后,在heightForRowAtIndexPath中,我添加了以下代码:
if (IS_IOS_8_OR_LATER) {
self.tableView.rowHeight = UITableViewAutomaticDimension;
return self.tableView.rowHeight;
} else {//Custom code for ios version earlier than 8.0
}
这解决了问题