ฉันเพิ่งต่อสู้กับสิ่งนี้ ปัญหาของฉันคือโซลูชันที่โพสต์ข้างต้นโดยใช้heightForRowAtIndexPath:
วิธีการนี้จะใช้งานได้กับ iOS 7.1 ในเครื่องมือจำลองการทำงาน แต่หลังจากนั้นทำให้ผลลัพธ์หมดไปโดยการสลับไปใช้ iOS 8.1
ฉันเริ่มอ่านเพิ่มเติมเกี่ยวกับเซลล์ปรับขนาดตัวเอง (แนะนำใน iOS 8 อ่านที่นี่ ) เห็นได้ชัดว่าการใช้งานUITableViewAutomaticDimension
จะช่วยใน iOS 8 ฉันลองใช้เทคนิคนั้นและลบการใช้งานheightForRowAtIndexPath:
และ voila มันทำงานได้ดีใน iOS 8 ตอนนี้ แต่แล้ว iOS 7 ก็ไม่ใช่ ฉันต้องทำอะไร ฉันต้องการheightForRowAtIndexPath:
iOS 7 ไม่ใช่ iOS 8
นี่คือทางออกของฉัน (ตัดเพื่อประโยชน์ของความกะทัดรัด) ซึ่งยืมมาจากคำตอบ @JosephH โพสต์ด้านบน:
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.estimatedRowHeight = 50.;
self.tableView.rowHeight = UITableViewAutomaticDimension;
// ...
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
return UITableViewAutomaticDimension;
} else {
NSString *cellIdentifier = [self reuseIdentifierForCellAtIndexPath:indexPath];
static NSMutableDictionary *heightCache;
if (!heightCache)
heightCache = [[NSMutableDictionary alloc] init];
NSNumber *cachedHeight = heightCache[cellIdentifier];
if (cachedHeight)
return cachedHeight.floatValue;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
CGFloat height = cell.bounds.size.height;
heightCache[cellIdentifier] = @(height);
return height;
}
}
- (NSString *)reuseIdentifierForCellAtIndexPath:(NSIndexPath *)indexPath {
NSString * reuseIdentifier;
switch (indexPath.row) {
case 0:
reuseIdentifier = EventTitleCellIdentifier;
break;
case 2:
reuseIdentifier = EventDateTimeCellIdentifier;
break;
case 4:
reuseIdentifier = EventContactsCellIdentifier;
break;
case 6:
reuseIdentifier = EventLocationCellIdentifier;
break;
case 8:
reuseIdentifier = NotesCellIdentifier;
break;
default:
reuseIdentifier = SeparatorCellIdentifier;
break;
}
return reuseIdentifier;
}
SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO (@ "8.0") จริง ๆ แล้วมาจากชุดคำจำกัดความของแมโครที่ฉันใช้ซึ่งฉันพบที่ไหนสักแห่ง (มีประโยชน์มาก) พวกเขาถูกกำหนดเป็น:
#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)