При использовании «Динамических прототипов» для указания содержимого 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
Я использовал этот метод некоторое время, а затем на новом раскадровке я получал в основном размеры нулевой высоты (и ширины) для ячеек. Даже ненулевые были неожиданными значениями. Отключение классов размера восстановило эту функциональность. Разочарование, тем не менее, поскольку это «исправление» отключает важную функциональность в раскадровке. Однако это сработало для моей неотложной необходимости. –
Я нашел более полное решение для [решения этой проблемы с включенными классами размера] (http://stackoverflow.com/questions/27735341/offscreen-uitableviewcells-for-size-calculations-not-respecting-size-class). –