UItableViewCell Expand/Collapse Animation (работает при расширении, но не при сворачивании)

как фон, этот вопрос связан с этим, который я разместил ранее: Попытка развернуть/свернуть UITableViewCell из UIButton в пользовательской ячейке

Подводя итог, у меня есть UITableView с несколькими пользовательскими ячейками таблицы. Каждый пользовательский UITableViewCell имеет текстовую область, за которой следует кнопка «Просмотреть больше». По сути, каждая ячейка изначально будет отображать 3 строки текста, но когда пользователь нажимает кнопку «Просмотреть больше», ячейка должна расширяться на всю высоту текстовой области. Повторное нажатие кнопки свернет ячейку.

Я думаю, что это сложно представить, поэтому я снял короткое видео здесь: http://dl.dropbox.com/u/762437/cell-animation.mov

(Это файл размером около 3,5 МБ, поэтому загрузка не займет много времени). В видео я показываю ячейку, выполняющую анимацию расширения/свертывания. При расширении кнопка «Просмотреть больше» перемещается вниз. При повторном нажатии он просто возвращается в исходное положение без анимации. Редактировать: Извините, я должен быть более ясным. UITableView правильно анимирует ячейки, я спрашиваю, как правильно анимировать кнопку «Просмотреть больше».

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

В каждом пользовательском классе UITableViewCell у меня есть IBAction, который вызывается, когда пользователь нажимает кнопку «Просмотреть больше». Я также отслеживаю ячейки, которые в настоящее время расширены в NSMutableArray. Когда пользователь нажимает кнопку «Закрыть», эта ячейка удаляется из массива.

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

Я делаю это с помощью этого кода:

// Check if the array contains the particular cell, if so, then it needs to be expanded 
if([expandedRows containsObject:indexPath])
        {
            // Expand the cell's text area to fit the entire contents
            [cell.textLabel sizeToFitFixedWidth:cell.textLabel.frame.size.width];

            // Find the new Y-position of where the "Close" button.
            // The new Y position should be at the bottom of the newly expanded text label

            CGFloat bottomYPos = cell.textLabel.frame.origin.y + cell.textLabel.frame.size.height;

            // Get a rect with the "Close" button's frame and new Y position
            CGRect buttonRect = cell.showAllButton.frame;
            buttonRect.origin.y = bottomYPos;

            // Animation block to shift the "Close" button down to its new rect             
            [UIView animateWithDuration:0.3
                                  delay:0.0
                                options: UIViewAnimationCurveLinear
                             animations:^{
                                 cell.showAllButton.frame = buttonRect;
                                 [cell.showAllButton setTitle:@"Close" forState:UIControlStateNormal];
                             } 
                             completion:^(BOOL finished){
                                 NSLog(@"Done 1!");
                             }];
        }
        else
        {
            // This cell is currently collapsed

            // Get the button rect and subtract the height delta to put it back
            // OriginalCellSizes is where I keep track of the original Y positions
            CGRect buttonRect = cell.showAllButton.frame;
            buttonRect.origin.y -= cell.frame.size.height - [[originalCellSizes objectAtIndex:indexPath.row] floatValue];

            // Animation block for the Button    
            [UIView animateWithDuration:0.3
                                  delay:0.0
                                options: UIViewAnimationCurveEaseOut
                             animations:^{
                                 cell.showAllButton.frame = buttonRect;
                                 [cell.showAllButton setTitle:@"View More" forState:UIControlStateNormal];
                             } 
                             completion:^(BOOL finished){
                                 NSLog(@"Done! 2");
                             }];
        }

После расследования я обнаружил, что в ветке «else» этого if-else buttonRect уже находится в той же позиции Y, что и исходная позиция. Я подозреваю, что именно поэтому не происходит анимации, но я не уверен.

Любая помощь будет действительно здорово!


person kurisukun    schedule 25.02.2012    source источник


Ответы (1)


простой способ сделать это ......

[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

insertIndexPaths — это массив NSIndexPaths, который нужно вставить в вашу таблицу.

deleteIndexPaths — это массив NSIndexPaths, который нужно удалить из вашей таблицы.

Пример формата массива для индексных путей:

NSArray *insertIndexPaths = [[NSArray alloc] initWithObjects:
        [NSIndexPath indexPathForRow:0 inSection:0],
        [NSIndexPath indexPathForRow:1 inSection:0],
        [NSIndexPath indexPathForRow:2 inSection:0],
        nil];

получил это из этого вопроса... этот вопрос...

person Nirav Gadhiya    schedule 04.03.2013
comment
Этот ответ не имеет ничего общего с заданным вопросом. - person Dalmazio; 25.07.2014
comment
Да, и это еще больше сбивает с толку. - person Dalmazio; 26.07.2014