2015-09-10 3 views
3

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

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

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

Что вы знаете, чтобы рассчитать высоту UITextView в heightForRowAtIndexPath?

ответ

0

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

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

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

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

Связанный вопрос с хорошим ответом: Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

+0

Вы не знаете, как обновить высоту 'textView' при изменении содержимого? http://stackoverflow.com/questions/32497229/how-update-height-of-the-cell-with-uitableviewautomaticdimension –

+0

@ János пытается использовать метод делегата 'textViewDidChange' и каждый раз вычислять новую высоту. – AlexZd

+0

no height constrant установлен в раскадровке –

3

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

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

  1. Я забыл установить тот же размер шрифта при расчете и UITextView
  2. 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; 
} 
+1

Спасибо, ключ был: textView.textContainerInset = UIEdgeInsetsZero; –

Смежные вопросы