Подтвердить что ты не робот

Вызов 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;
}
4b9b3361

Ответ 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 для каждой ячейки.