2013-10-06 4 views
17

У меня есть UITableview с несколькими многоразовыми таблицами TableViewCells. В одной ячейке у меня есть UITextView, который меняет размер, чтобы соответствовать его контенту. Теперь мне просто нужно изменить размер таблицы contentView TableViewCell, поэтому я могу прочитать текст while. Я уже пробовал:Как изменить размер UITableViewCell для его содержимого?

cell2.contentView.bounds.size.height = cell2.discriptionTextView.bounds.size.height; 

Или:

cell2.contentView.frame = CGRectMake(0, cell2.discriptionTextView.bounds.origin.y,  
cell2.discriptionTextView.bounds.size.width,  
cell2.discriptionTextView.bounds.size.height); 

В методе:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath 
*)indexPath {} 

Но это не будет работать.

Кто-нибудь знает, как это сделать?

Новый код:

@implementation AppDetail 

    CGFloat height; 
    … 

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {… 

    cell2.TextView.text = self.text; 
      [cell2.TextView sizeToFit]; 
      height = CGRectGetHeight(cell2.TextView.bounds); 
    … 
    } 

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

     if (indexPath.row == 0) { 
      return 143; 
     } 
     if (indexPath.row == 1) { 
      return height; 
     } 

     return 0; 
    } 

ответ

7

Вам необходимо ввести heightForRowAtIndexPath.

Скажите, что данные, которые должны отображаться в текстовом элементе, хранятся в NSArray.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
CGFloat cellheight = 30; //assuming that your TextView's origin.y is 30 and TextView is the last UI element in your cell 

NSString *text = (NSString *)[textArray objectAtIndex:indexpath.row]; 
UIFont *font = [UIFont systemFontOfSize:14];// The font should be the same as that of your textView 
CGSize constraintSize = CGSizeMake(maxWidth, CGFLOAT_MAX);// maxWidth = max width for the textView 

CGSize size = [text sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; 

cellHeight += size.height; //you can also add a cell padding if you want some space below textView 

} 
+0

ОК, теперь я добавил свой код, и он работает, но только во второй раз, когда вы просматриваете UIViewController. Я создал CGFloat, затем я назначил высоту UITextView для CGFloat. то я возвращаю созданный CGFloat в методе, который вы указали выше. Я выложу свой новый код выше. –

+0

1-я вещь, которую вы должны знать, это то, что вы не устанавливаете высоту для ячейки в 'cellForRowAtIndexpath'. Это должно быть сделано в 'heightForRowAtIndexpath' Вторая вещь заключается в том, что 'heightForRowAtIndexpath' вызывается до 'cellForRowAtIndexpath'. Это означает, что вы должны вычислить высоту ячейки, прежде чем заполнить одну и ту же ячейку. (Таблица должна быть проинформирована о высоте до начала начала ячейки. – dRAGONAIR

+0

Примечание: Все 'UILineBreakMode *' устарели, заменены на' NSLineBreakBy * ' – Raptor

16

Вы можете только изменить размер UITableViewCell в tableView:heightForRowAtIndexPath: метод делегата.

Вы должны оценить, какой будет размер текста, когда этот метод вызывается для каждой строки при загрузке tableView.

Это то, что я сделал для решения проблемы.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString * yourText = self.myArrayWithTextInIt[indexPath.row]; // or however you are getting the text 
    return additionalSpaceNeeded + [self heightForText:yourText]; 
} 

-(CGFloat)heightForText:(NSString *)text 
{ 
    NSInteger MAX_HEIGHT = 2000; 
    UITextView * textView = [[UITextView alloc] initWithFrame: CGRectMake(0, 0, WIDTH_OF_TEXTVIEW, MAX_HEIGHT)]; 
    textView.text = text; 
    textView.font = // your font 
    [textView sizeToFit]; 
    return textView.frame.size.height; 
    } 

EDIT

В то время как я использовал это решение на некоторое время, я нашел более оптимальный, что я рекомендовал бы использовать, поскольку он не требует выделения целой TextView для того, чтобы работать, и может обрабатывать текст, превышающий 2000.

-(CGFloat)heightForTextViewRectWithWidth:(CGFloat)width andText:(NSString *)text 
{ 
    UIFont * font = [UIFont systemFontOfSize:12.0f]; 

    // this returns us the size of the text for a rect but assumes 0, 0 origin 
    CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}]; 

    // so we calculate the area 
    CGFloat area = size.height * size.width; 

    CGFloat buffer = whateverExtraBufferYouNeed.0f; 

    // and then return the new height which is the area divided by the width 
    // Basically area = h * w 
    // area/width = h 
    // for w we use the width of the actual text view 
    return floor(area/width) + buffer; 
} 
+0

Пожалуйста, взгляните на мой новый код выше. –

+0

Что вы пытаетесь сделать? Измените размер содержимогоView textView или ячейки? – AdamG

+1

Метод, показанный выше, позволит вам изменить размер самой ячейки на основе размера содержимогоView данного текстового элемента в ячейке. Все, что вам нужно сделать, это найти текст, который вы используете для данной ячейки. – AdamG

12

Вот обновленная версия для прошивки 7+, что не чище (без дополнительной метод)

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     UIFont * font = [UIFont systemFontOfSize:15.0f]; 
     NSString *text = [getYourTextArray objectAtIndex:indexPath.row]; 
     CGFloat height = [text boundingRectWithSize:CGSizeMake(self.tableView.frame.size.width, maxHeight) options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName: font} context:nil].size.height; 

     return height + additionalHeightBuffer; 
    } 
2

Этого поток был давненько, но в прошивке 8 UITableViewAutomaticDimension были введен. Вы должны установить ограничения сверху вниз, как прокрутка, чтобы сделать эту работу. Но после этого, просто добавьте следующий код viewDidLoad():

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 122.0 

Убедитесь, что оценивается высота как можно ближе к реальным вещам, в противном случае вы получите некоторый багги прокрутку.

12

Как @Rob Norback сказал, что-то называется UITableViewAutomaticDimension.

Для Swift самый простой способ изменить размер содержимого UITableViewCell «на лету» - это просто добавить это.

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 
+0

Спасибо. Прочитав много других сообщений, это действительно работает. – petrsyn

+0

приветствуется @petrsyn! –

+3

это не сработало для меня. – DeyaEldeen

1

Я предпочитаю this solution of Jure

  • Во-первых, установить ограничения TextView прикалываться с надтаблицы (contentView ячейки в данном случае).
  • Отключить textView.scrollEnabled
  • Set

    table.rowHeight = UITableViewAutomaticDimension; 
    tableView.estimatedRowHeight = 44; 
    

    Если, наконец, ваш код не работает, а затем использовать это вместо

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
        return UITableViewAutomaticDimension; 
    } 
    
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { 
        return 44; 
    } 
    
  • Реализовать UITextViewDelegate так:

    - (void)textViewDidChange:(UITextView *)textView { 
        CGPoint currentOffset = self.tableView.contentOffset; 
        [UIView setAnimationsEnabled:NO]; 
        [self.tableView beginUpdates]; 
        [self.tableView endUpdates]; 
        [UIView setAnimationsEnabled:YES]; 
        [self.tableView setContentOffset:currentOffset animated:NO]; 
        } 
    
+0

Любые другие примеры без раскадровки? –

1

Добавление этих двух методов в ViewController с UITableViewAutomaticDimension должно сделать трюк. Он работал для меня при встраивании UITextView внутри UITableViewCell с текстом переменной длины.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewAutomaticDimension; 
} 

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return UITableViewAutomaticDimension; 
} 
0

В случае UILabel подвид в UITableViewCell, я достиг Авторазмер метки, просто установив ограничения лейбла (с использованием раскадровки, Xcode 8.3.2).

Это работает, поскольку, по-видимому, поведение метки и ячейки по умолчанию - sizeToFit. То же самое должно работать и для UITextView.

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