UITableviewcells нежелательная анимация сбоку

Я пытаюсь анимировать табличное представление в представлении, использующем автомакет.

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

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

[self.dataSelectionTable layoutIfNeeded]; 
[self.comparatorSelectionTable layoutIfNeeded];

[UIView animateWithDuration:0.5 animations:^{
    self.dataSelectionTableHeight.constant = 44;
    [self.view layoutIfNeeded]; and then captures all of the frame changes
} completion:^(BOOL finished){
    [UIView animateWithDuration:0.5 animations:^{
       self.comparatorSelectionTableHeight.constant = 200; 
       [self.view layoutIfNeeded];
    }];
}];

Я попытался изменить тип анимации, но это, похоже, не работает.

Вот ссылка на гифку с нежелательной боковой анимацией: http://makeagif.com/YubmP2

Изменить

Вот код для заполнения табличных представлений:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:13.0];
    }

    if (tableView == self.dataSelectionTable) {
        cell.textLabel.text = self.dataSelectionTitles[indexPath.row];
    }
    else {
        cell.textLabel.text = [self.comparatorList[indexPath.row] name];
    }

    return cell;
}

person pls    schedule 25.10.2014    source источник
comment
Хм, интересно... Что произойдет, если вы удалите все layoutIfNeeded до и внутри анимации?   -  person Lyndsey Scott    schedule 25.10.2014
comment
странное поведение, но как заполнить вторую таблицу: она находится на том же контроллере представления? Он предварительно заполнен?   -  person carlodurso    schedule 25.10.2014
comment
Линдси, если я удалю 2 layoutIfNeeded перед блоком анимации, это не повлияет на анимацию. Если я удалю те, что внутри блоков анимации, анимация не произойдет. Изменения просто встают на свои места.   -  person pls    schedule 25.10.2014
comment
Carlodurso Я добавил код, в котором я заполняю таблицы. Да, они на одном и том же контроллере представления.   -  person pls    schedule 25.10.2014


Ответы (1)


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

Я заметил, что если я устанавливаю постоянное значение ограничения высоты табличного представления равным 0 в viewDidLoad, cellForRowAtIndexPath не вызывается до тех пор, пока я не выполняю расширение, поэтому я предполагаю, что некоторые из представлений табличного представления не происходили до тех пор, пока потом.

Я исправил проблему, установив альфа-значение представления таблицы на 0 в IB и установив его высоту на 400 (значение, которое я хотел после расширения). Затем в viewDidAppear я сделал это,

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.heightCon.constant = 0;
    self.tableView.alpha = 1;
}

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

person rdelmar    schedule 25.10.2014
comment
Спасибо за ответ. Я реализовал остальную часть функциональности и обнаружил, что каждая последующая анимация работает нормально. Собирался опубликовать обновление на вопрос, но вы меня опередили :-) Попробовали ваше исправление, и оно лучше. Теперь анимируются только верхние и нижние несколько, а не все. - person pls; 26.10.2014