UITextView sizeThatFits возвращает разный размер, чем boundingRectWithSize

Требуется требуемая высота UITextView. sizeThatFits возвращает больше, но правильная высота, чем boundingRectWithSize. Почему существует разница?

В двух местах мне нужно знать высоту. В cellForRowAtIndexPath и в heightForRowAtIndexPath.

Я не думаю, что создать в heightForRowAtIndexPath всегда достаточно, чтобы знать, какая высота требуется.

Какое обходное решение вы знаете для вычисления высоты a UITextView в heightForRowAtIndexPath?

Ответ 1

Я встретил аналогичную проблему в прошлом месяце для UITableView, и я использую boundingRectWithSize для вычисления размера, это действительно правильно. Затем я помещаю его в UITextView.

Некоторые ошибки, которые я сделал:

  • Я забыл установить одинаковый размер шрифта при вычислении и для UITextView
  • UITextView имеет поля, я вручную добавлю его в heightForRowAtIndexPath и установлю textContainerInset на тот же самый.

Надеюсь, это поможет вам.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger section = indexPath.section;
    NSUInteger axisIndex = section - 2;
    yAxis *yAxisObj = self.yAxisInfoArray[axisIndex];
    boundingRect = [yAxisObj.yAxisDescription boundingRectWithSize:CGSizeMake(self.descriptionViewWidth, CGFLOAT_MAX)
                                                           options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading
                                                        attributes:@{NSFontAttributeName:self.contentFont}
                                                           context:nil];


    return boundingRect.size.height + TEXT_TOP_MARGIN + TEXT_BOTTOM_MARGIN;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellId = @"ChartDescriptionCell";
    ChartDescriptionCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if (!cell) {
        cell = [[ChartDescriptionCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
        cell.textView.bounces = NO;
        cell.textView.showsHorizontalScrollIndicator = NO;
        cell.textView.showsVerticalScrollIndicator = NO;
        cell.textView.font = self.contentFont;
        cell.textView.textColor = [UIColor colorWithHex:@"#333333"];
        cell.textView.textContainerInset = UIEdgeInsetsMake(TEXT_TOP_MARGIN, -5, TEXT_BOTTOM_MARGIN, -5);
    }
    NSInteger section = indexPath.section;
    NSUInteger axisIndex = section - 2;
    yAxis *yAxisObj = self.yAxisInfoArray[axisIndex];
    cell.textView.text = yAxisObj.yAxisDescription;
    }
    return cell;
}

Ответ 2

boundingRectWithSize возвращает размер текста, поэтому вы должны вручную указать свой шрифт.

sizeThatFits возвращает размер UITextView с этим текстом внутри

Если вы указываете на iOS 8 и выше, вы можете использовать динамическую высоту ячейки, что очень просто. В случае iOS 7 вам потребуется некоторое обходное решение.

Учебное пособие: http://www.raywenderlich.com/87975/dynamic-table-view-cell-height-ios-8-swift

Соответствующий вопрос с хорошим ответом: Использование автоматической компоновки в UITableView для динамических раскладок ячеек и высоты строк в строке