как фон, этот вопрос связан с вопросом, который я опубликовал ранее: Попытка развернуть / свернуть 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, что и исходная позиция. Я подозреваю, что именно поэтому анимация не происходит, но я не уверен.
Любая помощь будет очень полезна!