2012-09-22 56 views
6

我說的是像insertItemsAtIndexPathsmoveItemAtIndexPath:toIndexPath:之類的東西。我曾嘗試將它包裝在一個動畫塊中,但那不起作用。看起來動畫卡住了.25或.3秒,但我想減慢這一點。除了自己實施這個運動,這是不值得麻煩的,沒有人知道這對於公共API是否可行?有沒有辦法改變UICollectionViews的動畫速度?

回答

5

絕對!但是你無法正確使用UIView動畫塊。你需要挖掘Core Animation。

集合視圖有助於將動畫添加到支持每個UICollectionViewCellCALayer。但是如果您實現自己的佈局(或現有的子類),則可以在方法finalizeCollectionViewUpdates中對這些動畫進行所有必要的修改。

UICollectionViewLayout類文檔:

集合視圖調用此方法如前述動畫任何改變到位之前的最後一個步驟。

下面是如何用自己的替換默認位置動畫的例子:

- (void)finalizeCollectionViewUpdates 
{ 
    for (UICollectionViewCell *cell in [self.collectionView visibleCells]) 
    { 
     CAAnimation *positionAnimation = [cell.layer animationForKey:@"position"]; 
     if (positionAnimation) 
     { 
      [cell.layer removeAnimationForKey:@"position"]; 

      CALayer *presentationLayer = cell.layer.presentationLayer; 
      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; 
      [animation setFromValue:[NSValue valueWithCGPoint:presentationLayer.position]]; 
      [animation setToValue:[NSValue valueWithCGPoint:cell.layer.position]]; 
      [animation setDuration:0.4]; 

      [cell.layer addAnimation:animation forKey:@"position"]; 
     } 
    } 
} 

只看CALayer動畫相關的方法,看你如何挖成什麼樣的動畫正在運行在你的圖層上。

使用這種方法,您甚至可以使用CAKeyframeAnimation或其他任何你能想到的創意並添加過沖/反彈效果。你也可以做一些事情,比如選擇性地禁用一些動畫(如大小)並保留其他的(如位置)。

1

複製這種過度從這裏:https://stackoverflow.com/a/18392148/1751266

您可以更改動畫的速度與CALayer的。因此,對於UICollectionView這看起來像以下:

[self.collectionView.viewForBaselineLayout.layer setSpeed:0.1f]; 

而且你可以改回原來的速度:

[self.collectionView.viewForBaselineLayout.layer setSpeed:1.0f]; 

對於這個工作,你可能需要導入QuartzCore:

#import <QuartzCore/QuartzCore.h> 

請記住,它會影響同一圖層上的任何其他動畫,包括動畫UIImageView等,因此它們可能需要補償。

相關問題