Вызов heightForRowAtIndexPath изнутри cellForRowAtIndexPath?
Итак, кажется, что heightForRowAtIndexPath
вызывается до cellForRowAtIndexPath
. В настоящее время я использую cellForRowAtIndexPath
для вычисления высоты каждой ячейки (они являются переменной высотой, используя UILabel
с различным количеством текста в ней.
Я озадачен тем, как правильно настроить высоту ячейки, если метод, который устанавливает высоту, вызывается перед тем способом, который вычисляет.
Я создал категорию NSString
, а другой из UILabel
, которые работают вместе, делают UILabel
правильным. Проблема заключается в том, что экземпляры UITableViewCell
, содержащие эти метки, не изменяются, поэтому надписи наклеиваются на конце каждой метки, перекрывая их внизу.
Я знаю, что мне нужно сделать, чтобы высота ячейки равнялась высоте метки, плюс некоторое дополнительное пространство в поле, но я озадачен тем, как я могу установить высоту до того, как высота метки была рассчитывается. Могу ли я установить высоту кого-то, не используя heightForRowAtIndexPath
? Или, если нет, могу ли я вычислить высоту ячейки в другом месте? В настоящее время я использую indexPath.row
, чтобы это произошло, поэтому делать это заранее было бы сложно. Здесь код my cellForRowAtIndexPath:
cellForRowAtIndexPath
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
FQCustomCell *_customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"];
if (_customCell == nil) {
_customCell = [[FQCustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"];
}
_customCell.myLabel.text = [[_loadedNames objectAtIndex: indexPath.row] name];
_customCell.myLabel.font = [UIFont fontWithName: @"FontA" size: 15.0f];
UIView *backView = [[UIView alloc] initWithFrame: CGRectZero];
backView.backgroundColor = [UIColor clearColor];
_customCell.backgroundView = backView;
_customCell.myLabel.frame = CGRectMake(5, 5, 265, 65);
[_customCell.myLabel sizeToFitMultipleLines];
return _customCell;
}
Ответы
Ответ 1
Вам нужно рассчитать высоту ячейки в heightForRowAtIndexPath
, что-то вроде
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *theText=[[_loadedNames objectAtIndex: indexPath.row] name];
CGSize labelSize = [theText sizeWithFont:[UIFont fontWithName: @"FontA" size: 15.0f] constrainedToSize:kLabelFrameMaxSize];
return kHeightWithoutLabel+labelSize.height;
}
Вы можете установить некоторые ограничения на размер метки, установив kLabelFrameMaxSize
#define kLabelFrameMaxSize CGSizeMake(265.0, 200.0)
Затем вы возвращаете высоту, добавляя постоянную высоту с высотой метки метки.
Кроме того, чтобы быть последовательным, вы должны использовать ту же методологию, чтобы установить кадр в cellForRowAtIndexPath
вместо использования sizeToFitMultipleLines
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
FQCustomCell *_customCell = [tableView dequeueReusableCellWithIdentifier: @"CustomCell"];
if (_customCell == nil) {
_customCell = [[FQCustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"CustomCell"];
}
_customCell.myLabel.text = [[_loadedNames objectAtIndex: indexPath.row] name];
_customCell.myLabel.font = [UIFont fontWithName: @"FontA" size: 15.0f];
UIView *backView = [[UIView alloc] initWithFrame: CGRectZero];
backView.backgroundColor = [UIColor clearColor];
_customCell.backgroundView = backView;
CGSize labelSize = [_customCell.myLabel.text sizeWithFont:_customCell.myLabel.font constrainedToSize:kLabelFrameMaxSize];
_customCell.myLabel.frame = CGRectMake(5, 5, labelSize.width, labelSize.height);
return _customCell;
}
Ответ 2
Вы должны вычислить высоту ячейки в методе heightForRowAtIndexPath
. Это нужно сделать, не используя никакой UILabel, точно так же, как реализация heightForRowAtIndexPath
в ответе JP Hribovsek.
Затем в cellForRowAtIndexPath
не устанавливайте кадр любых подзонов и не вызывайте метод sizeToFitMultipleLines
метки. Вместо этого реализуйте layoutSubviews
метод FQCustomCell
, чтобы рамки подкадров были правильно установлены для любых возможных границ ячейки. Вы не должны заботиться о тексте или размере шрифта в этом методе, просто убедитесь, что поля метки являются правильными. Если высота ячейки правильно рассчитана в методе heightForRowAtIndexPath
, размер ваших меток будет в порядке.
Ответ 3
Для каждой ячейки heightforRowAtIndexPath вызывается сначала, а затем CellForRowAtIndexPath. Таким образом, вы можете сначала рассчитать высоту, а затем заполнить данные в CellForRowAtIndexPath для каждой ячейки.