2013-05-06 14 views
7

私はUICollectionViewを使用しているiPadアプリを持っており、各UICollectionViewCellにはただ1つのUIImageが含まれています。 現在、1ページに9個のUIImages(3行×3列)を表示していますが、いくつかのページがあります。zoom UICollectionView

ピンチジェスチャーを使用して、UICollectionView全体を拡大して1ページあたりの行数/列数を増減させたい場合は、ピンチジェスチャーの間に美しいズームアニメーションを使用することをお勧めします。

現在、私はUICollectionViewにピンチジェスチャーを追加しました。

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

それは動作しますが、私は時の滑らかなアニメーションを持っていない:それは、私が使用してフルUICollectionViewを更新変更された場合、私は、スケールファクタを使用して、行/列の数を計算するためにピンチジェスチャーイベントをキャッチ遷移。

UICollectionViewはUIScrollViewを継承していますが、私の目標を達成するためにUIScrollView Pinchジェスチャー機能を再利用する可能性はありますか?

答えて

0

私の2セント質問に申し訳ありません、私は解決策を、非常に簡単に見つかりました。

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

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

UICollectionViewのすべての細胞が正常に変更し、素敵なtransitionとされています。私は次のことを行っている私のPinchGestureコールバックで

+4

これはスケーリングを扱う適切な方法ではありません。基本的に、collectionView全体の再描画を強制しています。レイアウトの無効化 '[collectionView.collectionViewLayout invalidateLayout]'によって既にサポートされています。私はより完全な説明と例で答えを残しました。 – 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ちょうどショーのためにされ、あなたが他の属性にこの同じ概念を適用することができ、これは」doesnのユーザー自身がスケールのタイミングを運んでいるため、beginUpdates/endUpdatesを必要とします。

Here's a running project(実際には見たい場合)

+0

+1ありがとうございます!あなたのデモとその本当に便利なものをチェックしました。これらのトランジションを素敵なアニメーションでどのように表示することができるかをガイドできますか?私はUICollectionViewの初心者です。 – Yogi

+1

レイアウトがより固定されていて、ズームイン/ズームアウトしてパンを動かす(アイテムを移動しない)場合、何をすべきかについての洞察があれば、素晴らしい答えです。たとえばマップ上のアイテムがUICollectionCellsであり、タイルが再利用可能なビューなどである可能性があると考えてください。 – MobileVet

+1

@MobileVet私の論文のために、マップのようなものを作成するカスタムUICollectionViewLayoutとその完全に可能なものを書きました。コレクションビューのレイアウトレポートに表示されるコンテンツのサイズをスケールファクタで大きくする場合は、ズームとパンの両方を行うことができます。 – Can