Получить нестандартную высоту ячейки прототипа из раскадровки?

Когда используешь "Динамические прототипы » для уточнения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

Ответы на вопрос(2)

Ваш ответ на вопрос