При использовании "Динамических прототипов" для указания содержимого UITableView
на раскадровке существует свойство "Высота строки", которое может быть установлено на "Пользовательский".
При создании экземпляров ячейки эта настраиваемая высота строки не учитывается. Это имеет смысл, поскольку используемая ячейка прототипа определяется моим кодом приложения во время создания ячейки. Чтобы создать экземпляр всех ячеек при расчете макета, вы получите штраф за производительность, поэтому я понимаю, почему это невозможно.
Затем возникает вопрос, можно ли каким-либо образом получить высоту, заданную идентификатором повторного использования соты, например.
[myTableView heightForCellWithReuseIdentifier:@"MyCellPrototype"];
или что-то в этом направлении? Или мне нужно дублировать явные высоты строк в моем коде приложения, с последующим бременем обслуживания?
Решено, с помощью @TimothyMoose:
Высоты сохраняются в самих ячейках, что означает, что единственный способ получить высоту - создать экземпляр прототипов. Один из способов сделать это - предварительно очистить ячейки вне обычного метода обратного вызова. Вот мой небольшой POC, который работает:
#import "ViewController.h"
@interface ViewController () {
NSDictionary* heights;
}
@end
@implementation ViewController
- (NSString*) _reusableIdentifierForIndexPath:(NSIndexPath *)indexPath
{
return [NSString stringWithFormat:@"C%d", indexPath.row];
}
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(!heights) {
NSMutableDictionary* hts = [NSMutableDictionary dictionary];
for(NSString* reusableIdentifier in [NSArray arrayWithObjects:@"C0", @"C1", @"C2", nil]) {
CGFloat height = [[tableView dequeueReusableCellWithIdentifier:reusableIdentifier] bounds].size.height;
hts[reusableIdentifier] = [NSNumber numberWithFloat:height];
}
heights = [hts copy];
}
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
return [heights[prototype] floatValue];
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:prototype];
return cell;
}
@end