В настоящее время я работаю над проектом, в который я встроил UITableView
внутри UITableViewCell
.
Что мне нужно сделать, так это отключить прокрутку UITableView
и сделать UITableView
в соответствии с размером всех строк. Но поскольку UITableView
наследует от UIScrollView
, использование Autolayout не заставляет UITableView
делать высоту ячейки в зависимости от ее contentSize (а не фрейма) при возврате UITableViewAutomaticDimension
.
Решение iOS 7
Это было легко достижимо до iOS 7, поскольку я получаю ссылку на ячейку под heightForRowAtIndexPath:
, используя следующий код:
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
int height = cell.tableView.contentSize.height;
return height;
но в iOS 8 он дает BAD_ACCESS, поскольку iOS 8 вызывает heightForRowAtIndexPath:
до того, как был вызван cellForRowAtIndexPath:
.
Подход iOS 8
Объявить свойство для сохранения ссылки на ячейку:
@property (strong, nonatomic) UITableViewCell *prototypeCell
Используйте метод для сохранения текущей ссылки на ячейку для свойства, чтобы использовать ее:
- (id)prototypeCellatIndexPath:(NSIndexPath *)indexPath {
NSString *cellID = @"MyCell";
if (!_prototypeCell) {
_prototypeCell = [self.tableView dequeueReusableCellWithIdentifier:cellID];
}
return _prototypeCell;
}
Получите UITableView
из UITableViewCell
из прототипа и из его contentSize. Я получаю высоту, и я возвращаю ее в heighForRowAtIndexPath:
из приведенного ниже метода:
-(int)heightForThreadAtIndexPath:(NSIndexPath *)indexPath {
_prototypeCell = [self prototypeCellatIndexPath:indexPath];
[_prototypeCell.contentView setNeedsLayout];
[_prototypeCell.contentView layoutIfNeeded];
int footer = [_prototypeCell.tableView numberOfSections]*_prototypeCell.tableView.sectionFooterHeight;
int header = [_prototypeCell.tableView numberOfSections]*_prototypeCell.tableView.sectionHeaderHeight;
int height = ceilf(_prototypeCell.tableView.contentSize.height) + _prototypeCell.tableView.contentOffset.y + _prototypeCell.tableView.contentInset.bottom + _prototypeCell.tableView.contentInset.top + header + footer;
NSLog(@"%i, %i", (int)ceilf(_prototypeCell.tableView.contentSize.height), height);
return height;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self heightForThreadAtIndexPath:indexPath];
}
Проблема
contentSize.height, который я возвращаю из prototypeCell, неверен, и он не соответствует реальному contentSize UITableView
, но когда я регистрирую реальный contentSize под Класс CustomCell показывает правильный контент, который отличается от того, который находится под прототипомCell.
Это заставляет меня задаться вопросом, может быть, я должен попытаться удалить из ячейки ячейку в определенном состоянии, чтобы получить правильный контент, но журналы показывают одинаковые значения.
Я много разбираюсь и пробую разные идеи, но пока никто не работал. Я не знаю, пытался ли кто-то попытаться достичь подобной вещи, как я, и решил это. Будет очень приятно, если вы дадите мне идею или что-то в этом роде.