Получить нестандартную высоту ячейки прототипа из раскадровки?
Когда используешь "Динамические прототипы » для уточненияUITableView
содержание на раскадровке естьВысота строки" свойство, которое можно установить на Custom.
При создании экземпляров ячеек эта пользовательская высота строки не учитывается. Это имеет смысл, поскольку ячейка прототипа, которую я использую, определяется кодом моего приложения в момент создания этой ячейки. Создание экземпляров всех ячеек при расчете макета может привести к снижению производительности, поэтому я понимаю, почему этого нельзя сделать.
Тогда возникает вопрос, могу ли я каким-то образом получить высоту, учитывая идентификатор повторного использования ячейки, например,
[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