2014-01-06 92 views
4

我有一個UICollectionView可以添加和刪除單元格。我正在使用performBatchUpdates進行這些更改,並且佈局按預期動畫化。在deleteItemsAtIndexPaths的UICollectionView中動畫contentOffset更改

當我滾動到內容的結尾並刪除一個項目,使contentSize減少時,會出現問題:這會導致contentOffset發生更改,但該更改不是動畫效果。相反,在刪除動畫完成後,contentOffset會立即跳轉。我試過手動更新contentOffset以及刪除,但這並不適用於我。

我使用的是自定義佈局,但我看到有一個標準的流佈局相同的行爲,使用下面的代碼:

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return self.items.count; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; 
    UILabel *label = (UILabel *)[cell viewWithTag:1]; 
    label.text = [self.items objectAtIndex:indexPath.item]; 
    return cell; 
} 

- (IBAction)addItem:(UIBarButtonItem *)sender 
{ 
    self.runningCount++; 
    [self.items addObject:[NSString stringWithFormat:@"Item %u",self.runningCount]]; 
    [self.collectionView performBatchUpdates:^{ 
     [self.collectionView insertItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:self.items.count-1 inSection:0]]]; 
    } completion:nil]; 
} 

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self.items removeObjectAtIndex:indexPath.item]; 

    [self.collectionView performBatchUpdates:^{ 
     [self.collectionView deleteItemsAtIndexPaths:@[indexPath]]; 
    } completion:nil]; 
} 

我覺得我必須缺少明顯的東西,但是這有我難倒。

+0

我希望你不介意我問,但我不知道你是否遇到類似的情況,刪除一個項目,這樣'contentSize'縮小&視圖滾動導致滾動到視圖中的項目不會出現,直到刪除動畫完成?重現的代碼與您發佈的代碼幾乎完全相同,所以我想你一定也看過它了?我[發佈了一個問題](http://stackoverflow.com/q/25528337/429427)解釋它;如果你有時間看一看,我會很感激。 – Stuart

回答

9

看到動畫故障時,集合視圖的contentSize會縮小,使其高度或寬度變得小於(或等於)集合視圖邊界的高度或寬度。

可以使用setContentOffset:animated:和類似方法強制批量更新塊中的預期動畫,但這依賴於知道刪除後的預計內容大小。內容大小由集合視圖佈局管理,但由於我們還沒有實際刪除單元格,因此我們不能只問問佈局(或者我們會得到舊的大小)。

要解決此問題,我在自定義佈局中實施了targetContentOffsetForProposedContentOffset:方法,以根據需要調整內容偏移量。下面的代碼,只爲Y軸偏移賬戶,足以滿足我的需求:

- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset 
{ 
    if (self.collectionViewContentSize.height <= self.collectionView.bounds.size.height) 
    { 
     return CGPointMake(proposedContentOffset.x,0); 
    } 
    return proposedContentOffset; 
} 

我在直接UICollectionViewFlowLayout子嘗試了這一點,它沒有做這項工作了。

+0

好找。我只是自己遇到了這個問題,而且這個解決方案的確有竅門(或許值得一提的是,如果contentInset不爲零,可能需要考慮'contentInset')。似乎很奇怪,targetContentOffset ...的默認實現不能捕獲這種情況 - 我會提交一個錯誤報告。 – Stuart

相關問題