Saya baru-baru ini bergulat dengan ini. Masalah saya adalah solusi yang diposting di atas menggunakanheightForRowAtIndexPath:
metode ini akan bekerja untuk iOS 7.1 di Simulator tetapi kemudian benar-benar mengacaukan hasil dengan hanya beralih ke iOS 8.1.
Saya mulai membaca lebih banyak tentang sel ukuran sendiri (diperkenalkan di iOS 8, baca di sini ). Tampak jelas bahwa penggunaan UITableViewAutomaticDimension
akan membantu di iOS 8. Saya mencoba menggunakan teknik itu dan menghapus penggunaan heightForRowAtIndexPath:
dan voila, sekarang berfungsi dengan sempurna di iOS 8 sekarang. Tetapi iOS 7 tidak. Apa yang harus saya lakukan? Saya diperlukan heightForRowAtIndexPath:
untuk iOS 7 dan bukan untuk iOS 8.
Inilah solusi saya (dipangkas demi singkatnya) yang meminjam dari jawaban @ JosephephH diposting di atas:
- (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") sebenarnya dari sekumpulan definisi makro yang saya gunakan yang saya temukan di suatu tempat (sangat membantu). Mereka didefinisikan sebagai:
#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)