CATransaction insertRowsAtIndexPaths,动画不会结束

时间:2015-01-26 19:53:02

标签: uitableview core-animation ios7.1 catransaction

我们的应用程序有一个tableview,允许用户最小化/最大化其部分。还有动画绑定到隐藏/显示行取决于用户的输入,以及连接到不同的设备(通过蓝牙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中的完成块。在单行离开屏幕之前,后者永远不会被调用。关于为什么tableview不会放弃CATransaction的任何想法?

1 个答案:

答案 0 :(得分:1)

我们能够解决这个问题而忘记发布我发现的有关我们应用的内容。 tableview不会放弃CATransaction的原因是因为行中的UIActivityIndi​​cator子视图。它们正在被动画化,所以CATransaction从未结束,因为它正在等待一个或多个UIActivityIndi​​cators停止动画。

因此,对于可能遇到此问题的人,请检查是否有动画的子视图。