2014-12-02 2 views
-1

Я строю таблицу, которая показывает запись для пользователя. Одна из ячеек отображает набор «тегов», загруженных с сервера. В настоящее время я создаю набор UILabels и вручную добавляю их в представление, содержащееся в ячейке. Хотя это работает, ячейка не динамически изменяет размер после добавления тегов. Теги перекрывают ячейку под ней, и я не могу понять, как вручную обновлять высоту ячейки.Обновление высоты UITableViewCell

В cellForRowAtIndexPath:

JournalTagsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"JournalTagsCell" forIndexPath:indexPath]; 


//Check if we have any tags to show 
if(self.journalObject.journalEntryTags != nil){ 
    cell.placeholderLabel.hidden = YES; 
    cell.tagsView = [self updateTagsView:cell.tagsView]; 
} 

return cell; 

Ниже мой метод для фактического создания каждого тега, закладывая их и добавляя их к виду:

- (void)updateTagsView:(UIView*)viewToUpdate{ 

    NSArray *items = self.journalObject.journalEntryTags; 
    //Clean up the view first 
    NSArray *viewsToRemove = [viewToUpdate subviews]; 
    for (UIView *v in viewsToRemove) { 
     [v removeFromSuperview]; 
    } 

    float x = 10; 
    float y = 10; 

    for (int i = 0; i < items.count; i++) { 

     CGRect textRect = [items[i] boundingRectWithSize:CGSizeMake(self.view.frame.size.width - 20, 1000) 
               options:NSStringDrawingUsesLineFragmentOrigin 
               attributes:@{NSFontAttributeName:[UIFont tagCopy]} 
               context:nil]; 
     CGSize size = textRect.size; 


     if (x+size.width > (self.view.frame.size.width-20)) { 
      y += size.height + 10; 
      x = 10; 
     } 


     UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(x, y, size.width, size.height)]; 
     lbl.userInteractionEnabled = YES; 
     [lbl setText:[NSString stringWithFormat:@" %@ ", items[i]]]; 
     [lbl setFont:[UIFont tagCopy]]; 
     [lbl sizeToFit]; 
     [lbl setTextColor:[UIColor colorWithRed:0.145 green:0.392 blue:0.576 alpha:1.000]]; 
     [lbl setBackgroundColor:[UIColor colorWithRed:0.804 green:0.871 blue:0.914 alpha:1.000]]; 
     lbl.layer.borderWidth = 1; 
     lbl.layer.borderColor = [UIColor colorWithRed:0.145 green:0.392 blue:0.576 alpha:1.000].CGColor; 
     lbl.layer.cornerRadius = 5; 
     [lbl.layer setMasksToBounds:YES]; 
     [viewToUpdate addSubview:lbl]; 

     UITapGestureRecognizer *tapGesture = 
     [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userClickedOnTag:)]; 
     [lbl addGestureRecognizer:tapGesture]; 

     x += size.width + 10; 

     if (x > (self.view.frame.size.width-20)) { 
      y += size.height + 10; 
      x = 10; 
     } 

     if (i == items.count-1) { 
      y+= size.height + 20; 
     } 
    } 


    [viewToUpdate setFrame:CGRectMake(0, 0, self.view.frame.size.width, y)]; 
} 

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

+1

использовать автомат, вывести этот вид на четыре угла в ячейки – Dev

+0

Под автозагрузкой iOS 8 можно автоматически обеспечить высоту ячейки для TableView. Но это работает, только если вы используете ограничения; если вы добавляете subview программно, вам также необходимо будет добавлять ограничения программно. –

ответ

1

Я думаю, вам нужно будет использовать heightForRowAtIndexPath. Я не уверен, что вы полностью понимаете, что происходит. Или, может быть, я ошибаюсь. В любом случае, как я понимаю: общая высота «ячейки» всегда будет представлена. Вы никогда не устанавливаете «высоту» ячейки, она автоматически отображает весь контент. heightForRowAtIndexPath - это не способ сказать клетке, насколько высока она должна быть, а скорее, сколько места tableView должно резерв для этой конкретной ячейки. Если вы пройдете слишком короткую высоту, она все равно будет отображать всю ячейку, но следующая ячейка начнется слишком рано. Он также работает наоборот, если вы передадите большее количество, чем необходимо, это будет выглядеть, как клетки больше, хотя ячейки нет. Это просто представление tableView.

+0

Да, похоже, так оно и будет. Я действительно надеялся, что это будет так, потому что вычисление высоты каждой ячейки будет больно. –

+0

@JamesDobson В зависимости от вашего контента вам, вероятно, не придется * вычислять * каждую ячейку. Если, как вы сказали, вам нужна только одна ячейка, чтобы быть выше, и вы знаете, какой из них (какой индекс в вашем источнике данных), вы можете просто сделать что-то подобное в 'heightForRow..' (скажем, высокий - пятый элемент): 'if (indexPath.row == 4) return 88; else return 44; 'и все. Однако, если это динамический источник данных, который со временем изменит его контент, тогда это не-go. Однако применяется одна и та же логика. – Sti

+0

Различные ячейки должны рассчитывать свою высоту; одна ячейка содержит теги (одна в моем вопросе), но в других ячейках есть метки комментариев и описаний, которые могут быть чем угодно: от пустого до нескольких абзацев, поэтому, насколько мне известно, я не могу делать половинные меры - я либо вычисляю для каждой ячейки (или, по крайней мере, определить высоту, которая возможна, поскольку некоторые ячейки имеют определенную высоту), или я полагаюсь на автозапуск с ограничениями, которые до сих пор работали, так как мне нужно добавить это новое представление программно. –

0

Если вы используете IOS 8 вы можете использовать UITableViewAutomaticDimension.You можете проверить это example

self.tableView.rowHeight = UITableViewAutomaticDimension; 

Вы можете посмотреть также на этом video: Что нового в таблице и коллекции Представления в 2014 WWDC.

+0

, что «действительно круто, спасибо за это. К сожалению, нам нужно поддерживать iOS 7, поэтому я не думаю, что смогу это использовать. –

0

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

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation 

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

Убедитесь, что вы возвращаете значение по умолчанию для всей другой ячейки в heightForRowAtIndexPath(), за исключением ячейки с тегамиПримечание с вычисленной высотой ячейки.

-(CGFloat)tableView:(UITableView *)myTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexpath.row == TAGSVIEW_ROWINDEX) 
     return calculated_height_value; 
    return default_row_height; 
} 

Если ячейка с tagsView не предопределены с RowIndex, вы можете также хранить эту RowIndex в одной целой переменной в cellForRowAtIndexPath().

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