I've implemented automatic dynamic tableview cell heights for iOS 8 by using
self.tableView.rowHeight = UITableViewAutomaticDimension;
For pre-iOS 8, which does not support automatic dynamic cell heights, I overrided the heightForRowAtIndexPath method.
This is a similar to what I did: Using Auto Layout in UITableView for dynamic cell layouts & variable row heights
The problem is to how to write code that uses automatic cell height for iOS 8 but overrides heightForRowAtIndexPath for earlier iOS versions.
I'd like my custom heightForRowAtIndexPath method only if iOS version is less than 8.
Any suggestions on how to do this?
One solution would be to override the respondsToSelector:
method in your view controller. Have it return NO
under iOS 8 when checking for the heightForRowAtIndexPath:
method.
- (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];
}
This way, when the table view make a call like:
if ([self.delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]) {
}
your code will return NO
under iOS 8 or later and YES
under iOS 7 or earlier.
I found a simple solution.
Declared this macro to recognize if user has iOS 8.0 or later:
#define IS_IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
Then, inside heightForRowAtIndexPath I added the following code:
if (IS_IOS_8_OR_LATER) {
self.tableView.rowHeight = UITableViewAutomaticDimension;
return self.tableView.rowHeight;
} else {//Custom code for ios version earlier than 8.0
}
This solved the problem