2010-11-21 4 views
42

Я хотел бы иметь представление tablew с поведением, аналогичным приложению iPhone Contacts от Apple: uitableviewcell с uitextview внутри, так что, когда я пишу в uitextview, uitextview увеличивает его высоту, и поэтому соответственно динамический экран uitableviewcell регулирует его высоту. Я искал всю сеть, нахожу только частичные решения и отсутствие образца кода!Как сделать UITableViewCell с UITextView внутри, который динамически регулирует его высоту, на основе UITextView?

, пожалуйста, помогите мне, я отчаянный

Tony

ответ

0

Вы должны вернуть правильную высоту в методе делегата heightForRowAtIndexPath.

+0

Да, я знаю, это, но я не знаю, как реализовать «авторезистентность» содержимого и самой ячейки :-(У вас есть пример кода? спасибо. Tony – Tony

+0

А я вижу. У меня нет образца кода. попробуйте перезагрузить только эту ячейку, когда текст обновится, поэтому tableview пересчитывает высоту. Это может вызвать проблемы с тем, что текстовое поле уходит в отставку с первого ответчика. – Rengers

37

Глядя на это, вы должны быть несколько сложными. Вам нужно рассчитать высоту TextView динамически и на основе Высота TextView, вам необходимо вернуть высоты для ячейки ..

Это очень легко & несколько Tricky ..

Это код с помощью которого можно вычислить размер строки ....

во-первых получить размер строки

NSString *label = @"Sample String to get the Size for the textView Will definitely work "; 
CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15] 
         constrainedToSize:CGSizeMake(320, 9999) 
          lineBreakMode:UILineBreakModeWordWrap]; 

over here .... 
NSLog(@"%f",stringSize.height); 

во-вторых динамически создавать TextView в cell..giving в stringSize.height

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    //if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    //} 

    NSDictionary *d=(NSDictionary *)[self.menuArray objectAtIndex:indexPath.section]; 

    NSString *string = [d valueForKey:@"Description"]; 
    CGSize stringSize = [string sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:UILineBreakModeWordWrap]; 

    UITextView *textV=[[UITextView alloc] initWithFrame:CGRectMake(5, 5, 290, stringSize.height+10)]; 
    textV.font = [UIFont systemFontOfSize:15.0]; 
    textV.text=string; 
    textV.textColor=[UIColor blackColor]; 
    textV.editable=NO; 
    [cell.contentView addSubview:textV]; 
    [textV release]; 

    return cell; 
} 


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

    NSDictionary *d=(NSDictionary *)[self.menuArray objectAtIndex:indexPath.section]; 
    NSString *label = [d valueForKey:@"Description"]; 
    CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15] 
          constrainedToSize:CGSizeMake(320, 9999) 
           lineBreakMode:UILineBreakModeWordWrap]; 

    return stringSize.height+25; 

} 

Дав столько боли мои пальцы, ...... Я думаю, что это достаточно код ... &, несомненно, поможет решить вашу проблему ..

Good Luck

+1

этот ответ по-прежнему не завершен, пожалуйста, заполните его – harshalb

+0

Для меня он отлично работает ... Я ничего не видел в нем. Предложения по поводу изменений всегда приветствуются .... –

+0

Я думаю, что вы случайно присвоили UILabel и назначили его переменной textV вместо выделения фактического UITextView. – Shoerob

-1

вы можете получить programmatically.According размера UITextView до размера, установите высоту ячейки, используя следующий делегат

tableView:heightForRowAtIndexPath: 
12

Создание пользовательских UITableViewCell и добавить UITextView в продолжение ячейки entView.

В LayoutSubviews установите textView.frame для содержимого contentView.bounds (или выполните другой пользовательский макет).

При изменении содержимого TextView (обнаружен с помощью UITextViewDelegate), сделать две вещи:

1) вызов [tableView beginUpdates]; [tableView endUpdates]; Это заставит табличное пересчитать высоту для всех ячеек (будем называть tableView:heightForRowAtIndexPath:). Если ваша ячейка является делегатом для textView, вам нужно выяснить, как получить указатель на tableView, но есть несколько способов добиться этого. Или вы можете сделать делегата вашим контроллером вида ...

2) когда для этой ячейки вызывается tableView:heightForRowAtIndexPath:, верните textView.contentSize.height. Вы можете получить свою ячейку отсюда, позвонив [tableView cellForRowAtIndexPath]; Или, если у вас есть только одна из этих ячеек, кешируйте указатель на нее в вашем диспетчере viewController.

1

Наконец-то я получил его работу. Основная проблема заключается в том, как получить правильную ширину ячейки contentView. Ширина жесткого кодирования не работает для всех случаев, так как она может варьироваться в зависимости от стиля таблицы с обычным/сгруппированным столом, дополнительных аксессуаров или ландшафтной/портретной компоновки.Единственный способ получить 100% правильную ширину - это запросить его у объекта ячейки. Поэтому я создаю ячейку прямо в heightForRowAtIndexPath и сохраняю ее в кеше, после чего эта кэшированная ячейка будет возвращена методом cellForRowAtIndexPath. Другая проблема заключается в том, как заставить ячейку компоновку своих подзонов до ее использования. Это можно сделать, если мы временно добавим ячейку к tableView и обновим фрейм ячейки с шириной tabelView. После этого все подпункты будут правильно оформлены. Here - это то, как я работал в своей библиотеке TableKit.

2

Я написал свои исследования и решение для расчета UITableViewCell height based on an inner UITextView в своем блоге. Сообщение содержит код, который работает для универсальных приложений, стилей табличного вида и авторотации.

-2

Ребята, это действительно классный материал, но вы можете использовать tableview: didSelectRowForIndexPath: чтобы добавить UITextView в ячейку, поскольку она подзаголовка, когда пользователь ее удаляет, работает очень хорошо, так как вам нужно использовать только 1 UITextView, который вы можете повторно использовать и не будет мешать при получении татуировки! Отпустите его, когда закончите.

Подробнее? Просто спроси!

0

Попробуйте следующий код:

CGSize constraintSize; 
constraintSize.height = MAXFLOAT; 
constraintSize.width = yourTextView.frame.size.width; 
NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
             [UIFont fontWithName:@"yourFontName" size:yourFontSize], NSFontAttributeName, 
             nil]; 

CGRect frame = [yourTextView.text boundingRectWithSize:constraintSize 
            options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:attributesDictionary 
            context:nil]; 

CGSize stringSize = frame.size;//The string size can be set to the UITableViewCell 
3

Единственная проблема, которую я нашел с принятым ответом было то, что мы расПредеЛение UITextView каждый раз. Я обнаружил, что это вызвало проблемы с вводом в представление и немедленным обновлением текста, а также сохранением представления в качестве первого ответчика. Когда я попытался перезагрузить ячейку новой высотой, она попыталась бы добавить новый текстовый элемент.

Из-за этого я нашел несколько иной метод для достижения той же цели. Надеюсь, это другое решение может помочь людям, которые пытаются реализовать вышеуказанный код.

1) В файле заголовка определить переменную для высоты текста и TextView:

UITextView * _textView; 
NSInteger _textHeight; 

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

2) Загрузите вид текста и добавить его в нашу камеру

_textView = [[UITextView alloc] init]; 
_textView.delegate = self; 
_textView.returnKeyType = UIReturnKeyDone; 
_textView.font = [UIFont fontWithName:@"Helvetica" size:16]; 

if (![_user metaStringForKey:bBioKey].length) { 
    _textView.text = @"Placeholder text"; 
    _textView.textColor = [UIColor lightGrayColor]; 
} 


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

    if (indexPath == 0) { // Add logic to choose the correct cell 

     if (_textView.superview != cell) { 

      [cell addSubview:_textView];  

      _textView.keepTopInset.equal = KeepRequired(7); 
      _textView.keepBottomInset.equal = KeepRequired(7); 
      _textView.keepRightInset.equal = KeepRequired(10); 
      _textView.keepLeftInset.equal = KeepRequired(70); 
      } 
     } 
    } 
} 

Использование keeplayout позволило нам сохранить наше текстовое поле, чтобы всегда оставаться на той же высоте, что и сота. Мы также добавляем только UITextView один раз.

3) Добавьте код для вычисления высоты текста

- (NSInteger)getHeightOfBio: (NSString *)text { 

    UILabel * gettingSizeLabel = [[UILabel alloc] init]; 
    gettingSizeLabel.font = [UIFont fontWithName:@"Helvetica" size:16]; 
    gettingSizeLabel.text = text; 
    gettingSizeLabel.numberOfLines = 0; 
    CGSize maximumLabelSize = CGSizeMake(240, 9999); // this width will be as per your requirement 

    CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize]; 

    return expectedSize.height; 
} 

Я пытался много, и нашел, что это работает лучший

4) Добавить некоторую логику в высоту ячейки, чтобы использовать это:

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

    if (indexPath.row == 0) { // Set the height for our changing textView 

     return 30 + [self getHeightOfBio:_textView.text]; 
    } 

    return 44; 
} 

очевидных нам нужно немного больше высоты, чем наша высота текста, поэтому я добавил дополнительное количество подушки, которые могут быть опробованы.

5) обновить вид каждый раз, когда персонаж набирается, чтобы проверить, если нужно увеличить размер:

- (void)textViewDidChange:(UITextView *)textView { 

    if ([self getHeightOfText:textView.text] != _textHeight) { 

     _textHeight = [self getHeightOfText:textView.text]; 

     [self.tableView beginUpdates]; 
     [self.tableView endUpdates]; 
    } 
} 

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

Затем мы используем наше сохраненное значение и сравниваем текущее значение с сохраненным значением. Очевидно, что если они одинаковы, нет смысла обновлять представление. Если они отличаются, мы обновляем значение, а затем обновляем нашу таблицу.

Этот бит я нашел хороший ответ на stackOverflow, в котором показано, как мы можем обновлять только высоты таблицы вместо самой ячейки. Зачем обновлять ячейку, когда нам это не нужно? Это означает, что, как только это называется, высота ячейки обновляется, и она увеличивается хорошо.

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

Подтверждает принятый ответ, который был разграблен для разных предметов по пути, но я также надеюсь, что этот ответ поможет некоторым людям, которые испытывают те же трудности, что и я.

1

Я редактировать ответ TomSwift, который является лучшим способом сделать это:

вот мой код клетки (в стриже)

class CommentaireTextViewCell: UITableViewCell,UITextViewDelegate { 

@IBOutlet weak var textViewCom: UITextView! 
weak var parentTableView:UITableView? 

@IBOutlet weak var constraintTextViewTopMargin: NSLayoutConstraint! 
@IBOutlet weak var constraintTextViewHeight: NSLayoutConstraint! 
@IBOutlet weak var constraintTextViewBottomMargin: NSLayoutConstraint! 
override func awakeFromNib() { 
    self.textViewCom.delegate = self; 
} 

func textViewDidChange(textView: UITextView) { 
    self.parentTableView?.beginUpdates(); 
    self.parentTableView?.endUpdates(); 
} 

func getHeight() -> CGFloat 
{ 
    constraintTextViewHeight.constant = self.textViewCom.contentSize.height; 
    // cell height = textview marge top+ textview height+ textView Marge bottom 
    return constraintTextViewTopMargin.constant+constraintTextViewHeight.constant+constraintTextViewBottomMargin.constant+8 
    // add 8 because it seems to have an inset inside the textView 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    self.textViewCom.becomeFirstResponder(); 
} 
} 

для объяснений, вид ячейки таблицы является слабыми СВОЙСТВАМИ из ячейку, поэтому я могу сказать ей обновить макет, когда пользователь вводит текст. Высота ячейки является суммой его верхнего ограничения на contentView, его нижнее ограничение на contentView и textView.contantSize.height, которая также равен постоянной TextView высоту

enter image description here

+0

Как называть getHeight()? – Satyam

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