2013-05-06 36 views
7

UICollectionView kullandığım bir iPad Uygulaması var ve her UICollectionViewCell sadece bir UIImage içeriyor. Şu anda sayfa başına 9 UIImages (3 satır * 3 sütun) görüntüleniyor, birkaç sayfam var.zoom all UICollectionView

Sayfa başına görüntülenen satır/sütun sayısını artırmak/azaltmak için tüm UICollectionView öğelerini yakınlaştırmak için Pinch Gesture'ı kullanmak istiyorum ve en iyi Pinch hareketi sırasında güzel yakınlaştırma animasyonuna sahip olmak istiyorum!

Şu anda UICollectionView cihazımda bir Pinch Gesture ekledim.

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

O inşaat ama sırasında düzgün animasyon yok: o zaman kullanıyorum tam UICollectionView güncellemek değiştiyse ben, ölçek faktörü kullanılarak satır/sütun sayısını hesaplamak için Çimdik Hareketle olayı yakalamak geçiş.

Herhangi bir fikrin var mı? UICollectionView, UIScrollView öğesinden miras alır, hedefime ulaşmak için UIScrollView Tutam jest özelliğini yeniden kullanmak mümkün mü?

cevap

0

2 sent sorusu için üzgünüm, çözümü çok basit buldum. UICollectionView başarıyla değiştirilir Kafesimden

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

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

Tüm hücreler ve güzel transition ile: Benim PinchGesture Geri arama durumunda

Sadece aşağıdaki yaptık.

+4

Bu, ölçeklemenin üstesinden gelmek için uygun bir yol değil, temel olarak, bu özellik zaten sayfa düzeninin geçersiz kılınmasıyla desteklendiğinde, tüm koleksiyonun yeniden çizilmesini engelliyorsunuzView [koleksiyonView.collectionViewLayout invalidateLayout] '. Daha kapsamlı bir açıklama ve örnek ile bir cevap bıraktım. – Can

+0

Lütfen bunun hakkında daha fazla ayrıntı ekleyebilir misiniz? – sebastien

25

Varsayılan UICollectionViewDelegateFlowLayout kullandığınızı varsayıyorum, değil mi? Ardından, temsilci yöntemlerine göre yanıt verdiğinizden emin olun ve tutam jest gerçekleştiğinde, düzeni yalnızca geçersiz kılın. Ben her öğenin boyutunu ayarlamak istiyorsanız Örneğin

, sıkıştırırken:

@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]; 
    } 
} 

mülkiyet self.scale göstermelik olduğunu, başka bir öznitelik için aynı kavram uygulayabilirsiniz, bu kokan Kullanıcının kendisi ölçeğin zamanlamasını taşıdığı için bir beginUpdates/endUpdates gerektirir.

Here's a running project, eylem halinde görmek istediğiniz takdirde.

+0

+1 Teşekkürler! Senin demo ve gerçekten yararlı kontrol etti. Bu geçişleri nasıl güzel bir animasyonla gösterebileceğimiz konusunda rehberlik edebilir misiniz? UICollectionView'a yeni başlayan biriyim. – Yogi

+1

Harika bir cevap, eğer düzen daha 'sabit' ise ve yakınlaştırma/uzaklaştırma ve etrafta gezinme (öğelerin hareket etmemesi) istiyorsanız ne yapacağınıza dair bir merakınız varsa merak ediyorum. Örneğin, harita üzerinde UICollectionCells olan öğeler ve potansiyel olarak yeniden kullanılabilir görünümler veya benzerleri olan bir harita düşünün. – MobileVet

+1

@MobileVet Tezim için harita gibi bir şey yaratan özel bir UICollectionViewLayout yazdım ve tamamen mümkün. Koleksiyon görünüm düzeninin bir ölçek faktörü ile daha büyük raporlar içeriğine sahip olursanız, hem yakınlaştırma hem de kaydırma yapabilirsiniz. – Can