我們的應用程序具有允許用戶最小化/最大化其區域的表格視圖。還有一些動畫可以隱藏/顯示行,具體取決於用戶的輸入,以及連接到不同的設備(通過藍牙4.0)。由於動畫的來源不同,我們設置了一個調度程序來一次處理一個動畫,以便在[tableview endUpdates]之後,我們沒有發生與行/節數不同步的任何崩潰。我們的目的一直非常好。CATransaction insertRowsAtIndexPaths,動畫並未結束
但是,我們餐桌上的一個新部分給了我一點悲傷。根據連接到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的任何想法?