2012-09-22 4 views
6

나는 insertItemsAtIndexPaths 또는 moveItemAtIndexPath:toIndexPath: 같은 것을 말하고 있어요. 애니메이션 블록에서 배치하는 시도했지만 작동하지 않았다. 애니메이션이 .25 초 또는 0.3 초에 멈춰있는 것처럼 보이지만 느리게 진행하고 싶습니다. 문제를 일으킬만한 가치가없는 운동을 직접 구현하는 것 이외에 공개 API에서 이것이 가능한지 아무도 알지 못합니까?UICollectionViews의 애니메이션 속도를 변경할 수있는 방법이 있습니까?

답변

5

물론! 그러나 UIView 애니메이션 블록을 사용하여 제대로 할 수는 없습니다. Core Animation을 파헤쳐 야합니다.

컬렉션보기는 각 UICollectionViewCell을 지원하는 CALayer에 애니메이션을 유용하게 추가합니다. 그러나 자신 만의 레이아웃을 구현하거나 기존의 서브 클래스를 구현하는 경우 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]; 

그리고 당신은 원래의 속도를 다시 변경할 수 있습니다

#import <QuartzCore/QuartzCore.h> 

: 이것은 당신이 QuartzCore을 수입해야 할 수도 있습니다 작동하려면

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

을 애니메이션이 적용된 UIImageViews 등을 포함하여 동일한 레이어의 다른 애니메이션에도 영향을 미치므로 보상이 필요할 수 있습니다.

관련 문제