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?


person weezma2004    schedule 26.01.2015    source источник


Ответы (1)


Мы смогли решить эту проблему, и я забыл опубликовать то, что я узнал о нашем приложении. Причина, по которой табличное представление не отпускало CATransaction, заключалась в подпредставлениях UIActivityIndicator в строках. Они анимировались, поэтому CATransaction никогда не завершалась, поскольку ждала, пока один или несколько UIActivityIndicators прекратят анимацию.

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

person weezma2004    schedule 18.08.2015