2013-05-06 2 views
7

저는 UICollectionView를 사용하고 각각의 UICollectionViewCell에 단 하나의 UIImage가 포함 된 iPad 응용 프로그램이 있습니다. 현재 페이지 당 UIImages (3 행 * 3 열) 당 9 개를 표시하고 있습니다. 여러 페이지가 있습니다.전체 확대/축소 UICollectionView

핀치 제스처를 사용하여 전체 UICollectionView를 확대/축소하여 페이지 당 표시되는 행/열의 수를 줄이고 Pinch 제스처 중에 아름다운 줌 애니메이션을 사용하는 것이 가장 좋습니다.

현재 UICollectionView에 핀치 제스처가 추가되었습니다.

[_theCollectionView performBatchUpdates:^{ 
    [_theCollectionView deleteSections:[NSIndexSet indexSetWithIndex:0]]; 
    [_theCollectionView insertSections:[NSIndexSet indexSetWithIndex:0]]; 
} completion:nil]; 

그것은 작동하지만 나는 동안 부드러운 애니메이션이없는 : 그 다음 내가 사용 전체 UICollectionView를 업데이트 변경된 경우 나, 스케일 팩터를 사용하여 행/열 수를 계산하기 위해 핀치 제스처 이벤트를 잡을 전이.

아이디어가 있으십니까? UICollectionView는 UIScrollView를 상속합니다. UIScrollView Pinch 제스처 기능을 다시 사용하여 내 목표에 도달 할 가능성이 있습니까?

답변

0

내 2 센트 질문에 대해 유감스럽게도 해결책을 찾았습니다. 매우 간단합니다. UICollectionView가 성공적으로 변경 내의

void (^animateChangeWidth)() = ^() { 
    _theFlowLayout.itemSize = cellSize; 
}; 

[UIView transitionWithView:self.theCollectionView 
        duration:0.1f 
        options:UIViewAnimationOptionCurveLinear 
       animations:animateChangeWidth 
       completion:nil]; 

모든 세포와 멋진 transition로 내 PinchGesture 콜백에서

난 그냥 다음 했어요.

+4

스케일링을 처리하는 적절한 방법이 아니므로 기본적으로 레이아웃 무효화 [[collectionView.collectionViewLayout invalidateLayout]'에 의해 해당 기능이 이미 지원되는 경우 collectionView 전체를 다시 그리게됩니다. 나는 철저한 설명과 예를 들고 답을 남겼다. – Can

+0

제발, 이것에 대해 더 자세히 설명해 주시겠습니까? – sebastien

25

기본 UICollectionViewDelegateFlowLayout을 사용한다고 가정합니다. 그런 다음 델리게이트 메서드에 적절하게 응답해야하며 꼬집음 동작이 발생하면 레이아웃을 무효화하면됩니다. 나는, 모든 항목의 크기를 조정하려는 경우 예를 들어

, 곤란 상태 :

@interface ViewController() <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout> 

@property (nonatomic,assign) CGFloat scale; 
@property (nonatomic,weak) IBOutlet UICollectionView *collectionView; 

@end 

@implementation ViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.scale = 1.0; 

    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"]; 

    UIPinchGestureRecognizer *gesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(didReceivePinchGesture:)]; 
    [self.collectionView addGestureRecognizer:gesture]; 

} 

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return CGSizeMake(50*self.scale, 50*self.scale); 
} 

- (void)didReceivePinchGesture:(UIPinchGestureRecognizer*)gesture 
{ 
    static CGFloat scaleStart; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     scaleStart = self.scale; 
    } 
    else if (gesture.state == UIGestureRecognizerStateChanged) 
    { 
     self.scale = scaleStart * gesture.scale; 
     [self.collectionView.collectionViewLayout invalidateLayout]; 
    } 
} 

속성 self.scale 단지 쇼를 위해, 당신은 다른 속성이 동일한 개념을 적용 할 수 있습니다,이 '아무튼 사용자 자신이 스케일의 타이밍을 전달하기 때문에 beginUpdates/endUpdates가 필요합니다.

Here's a running project (실제로 작동하고 싶은 경우).

+0

+1 감사합니다. 귀하의 데모를 확인하고 정말 유용합니다. 멋진 애니메이션으로 이러한 장면 전환을 표시하는 방법에 대해 안내 할 수 있습니까? 저는 UICollectionView의 초보자입니다. – Yogi

+1

레이아웃이 더 '고정'이고 항목을 이동하지 않고 확대/축소 및 이동하려는 경우 수행해야 할 작업에 대한 통찰력이 있다면 호기심이 있습니다. 지도의 항목이 UICollectionCells이고 타일이 재사용 가능성이 있거나 유사한 것으로 의심되는지도를 생각해보십시오. – MobileVet

+1

@MobileVet 내 논문을 위해 나는지도와 같은 무언가를 창조하는 커스텀 UICollectionViewLayout을 작성했으며, 전적으로 가능했다. 컬렉션 뷰 레이아웃이보고하는 내용 크기를 배율 인수로 크게 만들면 확대/축소 및 패닝을 모두 수행 할 수 있습니다. – Can