2013-05-06 6 views
7

Ich habe eine iPad App, wo ich eine UICollectionView verwende und jede UICollectionViewCell nur ein einziges UIImage enthält. Momentan zeige ich pro 9 UIImages (3 Zeilen * 3 Spalten) pro Seite an, ich habe mehrere Seiten.zoom gesamte UICollectionView

Ich möchte Pinch Gesture verwenden, um auf die gesamte UICollectionView zu zoomen, um die Anzahl der pro Seite angezeigten Zeilen/Spalten zu erhöhen bzw. zu verringern. Am besten wäre eine schöne Zoom-Animation während der Pinch-Geste!

Derzeit habe ich eine Pinch-Geste auf meiner UICollectionView hinzugefügt. Ich fange die Pinch-Geste Ereignis die Anzahl der Zeilen/Spalten zu berechnen, den Skalierungsfaktor verwendet wird, wenn es dann geändert hat ich die volle UICollectionView aktualisieren mit:

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

Es funktioniert, aber ich habe keine glatte Animation während der Übergang.

Irgendeine Idee? UICollectionView erbt von UIScrollView, gibt es eine Möglichkeit, die UIScrollView Pinch-Gesten-Funktion erneut zu verwenden, um mein Ziel zu erreichen?

Antwort

0

Sorry für meine 2 Cent Frage, ich habe die Lösung gefunden, sehr einfach.

In meinem PinchGesture Rückruf Ich habe folgendes gerade getan:

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

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

Alle Zellen meines UICollectionView sind eine schöne transition erfolgreich geändert und mit.

+4

Das ist nicht der richtige Weg, um Skalierung zu handhaben, Sie erzwingen im Grunde eine Neuzeichnung der gesamten SammlungView, wenn diese Funktion bereits von Layout-Invalidation unterstützt wird. [[CollectionView.collectionViewLayout invalidateLayout] '. Ich habe eine Antwort mit einer ausführlicheren Erklärung und einem Beispiel hinterlassen. – Can

+0

Bitte, können Sie mehr Details dazu hinzufügen? – sebastien

25

Ich nehme an, dass Sie das Standard UICollectionViewDelegateFlowLayout verwenden, richtig? Stellen Sie dann sicher, dass Sie entsprechend auf die Delegate-Methoden reagieren, und wenn die Pinch-Geste auftritt, einfach das Layout ungültig machen.

Zum Beispiel, wenn ich die Größe jedes Elements anpassen möchten, während Kneifen:

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

Das Anwesen self.scale ist nur für die Show, Sie das gleiche Konzept auf andere Attribut anwenden können, doesn diese‘ t erfordern ein beginUpdates/endUpdates, weil der Benutzer selbst das Timing der Skala trägt.

Here's a running project, falls Sie es in Aktion sehen wollen.

+0

+1 Danke! Überprüft deine Demo und es ist wirklich nützlich. Können Sie uns zeigen, wie wir diese Übergänge mit einer netten Animation zeigen können? Ich bin ein Neuling für UICollectionView. – Yogi

+1

Große Antwort, neugierig, wenn Sie einen Einblick haben, was zu tun ist, wenn das Layout "fester" ist und Sie vergrößern/verkleinern und schwenken möchten (nicht die Elemente verschieben). Stellen Sie sich beispielsweise eine Karte vor, bei der Elemente auf der Karte UICollectionCells und Kacheln sind, die möglicherweise wiederverwendbare Ansichten oder Ähnliches sind. – MobileVet

+1

@MobileVet Für meine Diplomarbeit habe ich ein benutzerdefiniertes UICollectionViewLayout geschrieben, das so etwas wie eine Karte erstellt, und das ist durchaus möglich. Wenn Sie die Inhaltsgröße für das Layout der Sammlungsansicht mit einem Skalierungsfaktor vergrößern, können Sie sowohl Zoomen als auch Schwenken verwenden. – Can

Verwandte Themen