2014-10-11 2 views
-2

Предполагая подкласс A UITableViewCell, который имеет два состояния: 1.) Показать заголовок (высота: 0-50px) 2.) Показать заголовок (высота: 0-50px) + UITableView (высота: 50-150 пикселей) (как внутри подкласса UITableViewCell)Как изменить размер UITableViewCell с переменным содержимым?

Точно одна ячейка А может находиться в состоянии 2, поэтому высота 200 пикселей. Все остальные ячейки находятся в состоянии 1, поэтому высота 50 пикселей.

Подкласс A выполнен с IB и имеет размер по умолчанию 200px.

контроллер, который управляет UITableView держит какая ячейка находится в состоянии 2.

Вопрос: Как изменить высоту, основываясь на состоянии?

я сделал осуществить heightForRowAtIndexPath следующим образом:

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    if (self.openTab && indexPath.row == self.openTab.row) { 
     return 200.0; 
    } else { 
     return 50.0; 
    } 
} 

Это не работает.

Кроме того, я пытался отрегулировать высоту в cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    static NSString *CellIdentifier = @"conversationTableViewCell"; 
    ConversationTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     [self.tableView registerNib:[UINib nibWithNibName:@"ConversationTableViewCell" bundle:nil] forCellReuseIdentifier:CellIdentifier]; 
     cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    } 

    if (self.openTab && indexPath.row == self.openTab.row) { 
     CGRect frame = cell.contentView.bounds; 
     frame.size.height = 200.0; 
     cell.contentView.bounds = frame; 

    } else { 
     CGRect frame = cell.contentView.bounds; 
     frame.size.height = 50.0; 
     cell.contentView.bounds = frame; 
    } 

    return cell; 
} 

Помимо изменения высоты границ в contentView, я также применять эту идею к раме и как пределы/рамки UITableView в пределах подкласса A непосредственно. Я также экспериментировал с несколькими другими методами (см. Комментарий). Ничего не работает.

Любые идеи, как это сделать?

+0

Где код, который устанавливает self.openTab свойство? – sha

+0

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

+0

Так что же конкретно не работает? Вызывается ли ваш 'heightForCell' для ячейки openTab? – sha

ответ

-1

решаемые его путем изменения размера UITableView, который был добавлен к contentView из подкласс А, вручную в layoutSubviews, например:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    if (self.openTab) { 
    CGRect frame = self.tableView.frame; 
    frame.size.height = 150.0; 
    self.tableView.frame = frame; 
    } else { 
    CGRect frame = self.tableView.frame; 
    frame.size.height = 0; 
    self.tableView.frame = frame; 
    } 
} 

EDIT: также важно добавить представление (например, UITableView) программно для UITableViewCell вместо использования IB, чтобы иметь возможность изменять его размер.

0

Если вы являетесь правильным, ваш первый код должен работать. вероятно, вы забыли

self.tableview.delegate = self 

и не проходит для этого метода

- (void)viewDidLoad { 
    [super viewDidLoad];  
    self.tableView.delegate=self; 
} 

и код:

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath 
{ 
    if (self.openTab && indexPath.row == self.openTab.row) { 
     return 200.0; 
    } else { 
     return 50.0; 
    } 
} 
+0

условный работает правильно ... делегат также настроен правильно ... я даже могу записать высоту ячейки/tableview и возвращает правильное значение, как ожидалось, но представление не отражает высоту ... – Scholle

+0

Я не знаю, я знаю, что говорю. Я только что сделал пример, он отлично работает. В моем примере я сделал следующий шаг: 1. создайте таблицу в раскадровке и установите делегат и источник данных 2.y положил этот метод: '- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath { if (indexPath.row% 2 == 0) { return 200.0; } else { return 50.0; } } 'Вот и все. – Sampayo

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