2012-11-03 63 views
1

在我們的應用程序中,用戶能夠以直觀的方式使用tableview外部的一些控件滾動到tableview中的下一部分。某些部分包含許多單元格,並且滾動動畫看起來不太平滑,因爲要滾動的單元太多。爲了簡單和理解動畫的緣故,我們想暫時移除動畫過度的單元格。UITableView在部分之間動畫滾動,同時臨時刪除過多單元格以簡化動畫

假定用戶是

section.0 row.5 out of 100 rows 

,他要滾動到

section.1 row.0 out of 100 rows 

然後我們要排序的跳過所有過多的細胞,而滾動動畫。所以我們暫時想要刪除

之間的所有單元格
e.g. section.0 row.10 untill section.0 row.98 

任何想法我可以通過這個嗎?我相信這對其他人也是有用的。我想盡可能地做到這一點。

+0

的子類,你再使用電池或者是每一個獨特之處? – Brian

+0

我在重複使用單元格。它會有所作爲嗎? – hfossli

+0

您可能可以使用可重用的外觀單元格,只需將數據重新加載到要製作動畫的位置即可。 – Brian

回答

0

我對你如何能夠處理這個問題有一些想法。首先是重新加載感興趣的單元格,並返回一個輕量級的單元格。您可以使用CGBitmapContext將圖像數據複製到「外觀」單元格中,而不是真正的單元格中。其次是重新加載UITableView的數據,然後不返回感興趣的行的數據。第三是實際刪除行。另一個想法可能是在動畫時禁用交互。

刷新行:

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone]; 
[self.tableView endUpdates]; 

插入/刪除行:

[tableView beginUpdate]; 
[tableView insertRowsAtIndexPaths:*arrayOfIndexPaths* withRowAnimation:*rowAnimation*]; 
[tableView endUpdate]; 

[tableView beginUpdate]; 
[tableView deleteRowsAtIndexPaths:*arrayOfIndexPaths* withRowAnimation:*rowAnimation*]; 
[tableView endUpdate]; 

禁用互動:

[UIApplication sharedApplication] beginIgnoringInteractionEvents]; 
0

這是一個早期嘗試。我覺得這是一個有點亂..

自我是UITableView的

- (void)scrollAndSkipCellsAnimatedToTopOfSection:(NSUInteger)section 
{ 
    CGRect sectionRect = [self rectForHeaderInSection:section]; 
    CGPoint targetPoint = sectionRect.origin; 
    CGFloat yOffsetDiff = targetPoint.y - self.contentOffset.y; 
    BOOL willScrollUpwards = yOffsetDiff > 0; 

    if(willScrollUpwards) 
    { 
     [self scrollAndSkipCellsAnimatedUpwardsWithDistance:fabs(yOffsetDiff)]; 
    } 
    else 
    { 
     [self scrollAndSkipCellsAnimatedDownwardsWithDistance:fabs(yOffsetDiff)]; 
    } 
} 

- (void)scrollAndSkipCellsAnimatedUpwardsWithDistance:(CGFloat)distance 
{ 
    // when going upwards contentOffset should decrease 

    CGRect rectToRemove = CGRectMake(0, 
          self.contentOffset.y + (self.bounds.size.height * 1.5) - distance, 
          self.bounds.size.width, 
          distance - (self.bounds.size.height * 2.5)); 

    BOOL shouldRemoveAnyCells = rectToRemove.size.height > 0; 

    if(shouldRemoveAnyCells) 
    { 
     // property on my subclass of uitableview 
     // these indexes may span over several sections 
     self.tempRemoveIndexPaths = [self indexPathsForRowsInRect:rectToRemove]; 
    } 

    [UIView setAnimationsEnabled:NO]; 
    [self beginUpdates]; 
    [self deleteRowsAtIndexPaths:self.tempRemoveIndexPaths withRowAnimation:UITableViewRowAnimationNone]; 
    [self endUpdates]; 
    [UIView setAnimationsEnabled:YES]; 

    [self setContentOffset:CGPointMake(0, self.contentOffset.y - distance) animated:YES]; 
} 

// And then I would probably have to put some logic into 
// - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 


- (void)scrollAndSkipCellsAnimatedDownwardsWithDistance:(CGFloat)distance 
{ 

}