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 перестанут анимироваться.

Поэтому для тех, кто может столкнуться с этой проблемой, проверьте, анимируются ли какие-либо подпредставления.

Другие вопросы по тегам