CATransaction insertRowsAtIndexPaths,动画不会结束
CATransaction insertRowsAtIndexPaths, animation doesn't end
我们的应用程序有一个 table 视图,允许用户 minimize/maximize 它的部分。根据用户的输入,还有绑定到 hiding/showing 行的动画,以及连接到不同设备(通过蓝牙 4.0)的动画。由于动画的不同来源,我们设置了一个调度程序来一次处理一个动画,这样我们就不会在 [table查看结束更新]。对于我们的目的来说,它一直工作得很好。
但是,我们 table 中的一个新部分让我有些难过。根据连接到 iPad 的设备,该部分有 1 行或 8-9 行。其余行的高度为 0。minimizes/maximizes 部分在有 8-9 行时就可以了。但是,当该部分只有一行时,table 的 insertRowsAtIndexPaths 动画不会完成,直到该部分的行离开屏幕。因此,除非用户更改选项卡或向下滚动到 table 足以将其推出屏幕,否则其他部分都不能 minimized/maximized,因为我们的调度程序会先检查它是否已忙。这是为动画调用的代码:
-(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 中也有完成块。在单行离开屏幕之前,后者永远不会被调用。关于 table 视图为何不放弃 CATransaction 的任何想法?
我们能够解决这个问题,但我忘记了 post 我对我们的应用程序的了解。 tableview 不会放弃 CATransaction 的原因是因为行中的 UIActivityIndicator 子视图。它们正在被动画化,因此 CATransaction 永远不会结束,因为它正在等待一个或多个 UIActivityIndicators 停止动画。
因此,对于那些可能 运行 遇到此问题的人,请检查是否有任何子视图正在动画化。
我们的应用程序有一个 table 视图,允许用户 minimize/maximize 它的部分。根据用户的输入,还有绑定到 hiding/showing 行的动画,以及连接到不同设备(通过蓝牙 4.0)的动画。由于动画的不同来源,我们设置了一个调度程序来一次处理一个动画,这样我们就不会在 [table查看结束更新]。对于我们的目的来说,它一直工作得很好。
但是,我们 table 中的一个新部分让我有些难过。根据连接到 iPad 的设备,该部分有 1 行或 8-9 行。其余行的高度为 0。minimizes/maximizes 部分在有 8-9 行时就可以了。但是,当该部分只有一行时,table 的 insertRowsAtIndexPaths 动画不会完成,直到该部分的行离开屏幕。因此,除非用户更改选项卡或向下滚动到 table 足以将其推出屏幕,否则其他部分都不能 minimized/maximized,因为我们的调度程序会先检查它是否已忙。这是为动画调用的代码:
-(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 中也有完成块。在单行离开屏幕之前,后者永远不会被调用。关于 table 视图为何不放弃 CATransaction 的任何想法?
我们能够解决这个问题,但我忘记了 post 我对我们的应用程序的了解。 tableview 不会放弃 CATransaction 的原因是因为行中的 UIActivityIndicator 子视图。它们正在被动画化,因此 CATransaction 永远不会结束,因为它正在等待一个或多个 UIActivityIndicators 停止动画。
因此,对于那些可能 运行 遇到此问题的人,请检查是否有任何子视图正在动画化。