CATransaction insertRowsAtIndexPaths, анимация не заканчивается
Наше приложение имеет табличное представление, которое позволяет пользователям свернуть / развернуть его разделы. Существуют также анимации, связанные с скрытием / отображением строк в зависимости от ввода пользователя, а также с подключением к различным устройствам (через Bluetooth 4.0). Из-за различных источников анимации мы настроили планировщик для обработки одной анимации за раз, чтобы не было никаких сбоев, привязанных к числу несинхронизированных строк / разделов после [tableview endUpdates]. Это работает очень хорошо для наших целей.
Тем не менее, новый раздел в нашей таблице приносит мне немного горя. В зависимости от устройства, подключенного к iPad, раздел имеет 1 строку или 8-9 строк. Остальные строки имеют высоту 0. Секция минимизирует / максимизирует очень хорошо, когда она имеет 8-9 строк. Когда в разделе есть только одна строка, анимация insertRowsAtIndexPaths для таблицы не завершается, пока строка раздела не исчезнет с экрана. Поэтому, если пользователь не меняет вкладки или не прокручивает их вниз настолько, чтобы таблица могла вытолкнуть ее за пределы экрана, ни один другой раздел не может быть свернут / развернут из-за того, что наш планировщик сначала проверяет, занята ли она. Вот код, который вызывается для анимации:
-(void)animateTableUsingAnimationType:(NSNumber*)aniType
{
static int animationID = -1;
if(tableAnimationBusy)
{
[self performSelector:@selector(animateTableUsingAnimationType:) withObject:aniType afterDelay:.05f];
}
else
{
tableAnimationBusy = true;
tat = [aniType intValue];
[CATransaction begin];
[CATransaction setCompletionBlock:^{
NSLog(@"Animation %d is complete!", tat);
tableAnimationBusy = false;
}];
//if-else if blocks checking for the animationID
//if open section 2
[self animateOpenTableSection:2]
else //undefined ID
tableAnimationBusy = false;
[CATransaction commit];
[self setUpLabelText];
}
}
и animateOpenTableSection:
-(void)animateOpenTableSection:(NSInteger)section
{
NSLog(@"Calling open on section: %d", section);
if (section == 2)
{
[self.tableView beginUpdates];
openFlagSettingsRowCount = fsr_COUNT; //max row count for section
[[MCUISectionHandler sharedInstance] sectionTouched:YES forSection:MCUISH_SECTION_NAME__FLAG];
NSMutableArray *indexPathsToInsert = [[NSMutableArray alloc] init];
for (NSInteger i = 0; i < fsr_COUNT; i++) {
[indexPathsToInsert addObject:[NSIndexPath indexPathForRow:i inSection:section]];
}
[self.tableView insertRowsAtIndexPaths:indexPathsToInsert withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}
}
Как видите, у меня есть операторы отладки в функции animateOpenTableSection, а также блок завершения в animateTableUsingAnimationType. Последний никогда не вызывается до тех пор, пока одна строка не исчезнет с экрана. Любые идеи относительно того, почему табличное представление не отпустило CATransaction?
1 ответ
Мы смогли решить эту проблему, и я забыл опубликовать то, что узнал о нашем приложении. Причина, по которой табличное представление не отпускало CATransaction, заключалась в том, что в строках были подпредставления UIActivityIndicator. Они были анимированными, поэтому транзакция CAT никогда не заканчивалась, поскольку она ожидала, пока один или несколько индикаторов UIActivity перестанут анимироваться.
Поэтому для тех, кто может столкнуться с этой проблемой, проверьте, анимируются ли какие-либо подпредставления.