Perfektionieren Untersicht Größenänderung in UICollectionView layout-übergang

Bin ich, eine app zu entwickeln, die eine UICollectionView - die collection view job ist zur Anzeige von Daten aus einer web-service.

Eine Besonderheit der app, die ich versuche zu implementieren ist, so dass der Benutzer ändern Sie das layout dieser UICollectionView aus der grid-Ansicht zur Tabellenansicht.

Ich verbrachte viel Zeit damit, zu perfekt und ich schaffte es, um es zu arbeiten. Jedoch gibt es einige Probleme. Der übergang zwischen den beiden layout sieht nicht gut aus und manchmal sind es die Pausen zwischen den wechseln von Ansichten und meine app ist Links mit einer Ansicht in einem unerwarteten Zustand sind. Das passiert nur, wenn der Benutzer schaltet zwischen raster-und Tabellen-Ansicht sehr schnell (durch drücken der changeLayoutButton) kontinuierlich.

So, natürlich gibt es einige Probleme und ich habe das Gefühl, der code ist ein wenig zerbrechlich. Ich muss auch zum lösen der oben genannten Probleme.

Ich beginnen werde, wie ich implementiert diese Ansicht.

Umsetzung

Da brauchte ich die zwei verschiedenen Zellen (grideCell und tableViewCell), um andere Dinge - die ich beschlossen, es wäre besser, Unterklasse UICollectionViewFlowLayout da es tut alles was ich brauche - alles, was ich tun müssen, ist ändern des Zellen-Größen.

Damit im Sinn ich habe zwei Klassen, Unterklassen UICollectionViewFlowLayout

Dies ist, wie diese zwei-Klassen Aussehen:

BBTradeFeedTableViewLayout.m

    #import "BBTradeFeedTableViewLayout.h"

@implementation BBTradeFeedTableViewLayout

-(id)init
{
    self = [super init];

    if (self){

        self.itemSize = CGSizeMake(320, 80);
        self.minimumLineSpacing = 0.1f;
    }

    return self;
}

@end

BBTradeFeedGridViewLayout.m

#import "BBTradeFeedGridViewLayout.h"

@implementation BBTradeFeedGridViewLayout

-(id)init
{
    self = [super init];

    if (self){

        self.itemSize = CGSizeMake(159, 200);
        self.minimumInteritemSpacing = 2;
        self.minimumLineSpacing = 3;
    }
    return self; 
}

@end

Sehr einfach, und wie Sie sehen können - nur die änderung der Zellgröße.

Dann in meinem viewControllerA Klasse I implementiert die UICollectionView etwa so:
Erstellt die Eigenschaften:

    @property (strong, nonatomic) BBTradeFeedTableViewLayout *tableViewLayout;
@property (strong, nonatomic) BBTradeFeedGridViewLayout *grideLayout;

in viewDidLoad

/* Register the cells that need to be loaded for the layouts used */
    [self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemTableViewCell" bundle:nil] forCellWithReuseIdentifier:@"TableItemCell"];
    [self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemGridViewCell" bundle:nil] forCellWithReuseIdentifier:@"GridItemCell"];

Den Benutzer auf eine Schaltfläche tippt, um zwischen layouts:

-(void)changeViewLayoutButtonPressed

Benutze ich einen BOOL um festzustellen, welches layout gerade aktiv ist, und, basierend auf, dass ich den Schalter mit diesem code:

[self.collectionView performBatchUpdates:^{

        [self.collectionView.collectionViewLayout invalidateLayout];
        [self.collectionView setCollectionViewLayout:self.grideLayout animated:YES];

    } completion:^(BOOL finished) {
    }];

In cellForItemAtIndexPath

Ich bestimmen, welche Zellen ich verwenden soll (raster-oder tableView) und das laden der Daten -, der code sieht wie folgt aus:

if (self.gridLayoutActive == NO){

            self.switchToTableLayout = NO;
            BBItemTableViewCell *tableItemCell = [collectionView dequeueReusableCellWithReuseIdentifier:tableCellIdentifier forIndexPath:indexPath];

            if ([self.searchArray count] > 0){

                self.switchToTableLayout = NO;

                tableItemCell.gridView = NO;
                tableItemCell.backgroundColor = [UIColor whiteColor];
                tableItemCell.item = self.searchArray[indexPath.row];

            }
            return tableItemCell;
        }else

        {

            BBItemTableViewCell *gridItemCell= [collectionView dequeueReusableCellWithReuseIdentifier:gridCellIdentifier forIndexPath:indexPath];

            if ([self.searchArray count] > 0){

                self.switchToTableLayout = YES;

                gridItemCell.gridView = YES;
                gridItemCell.backgroundColor = [UIColor whiteColor];
                gridItemCell.item = self.searchArray[indexPath.row];

            }

            return gridItemCell;
        }

Schließlich in der Zelle zwei-Klassen - ich benutze nur die Daten um das Bild /der text, wie ich brauche.

Auch in der grid-Zelle - das Bild ist größer und ich Entferne den text will ich nicht - das war der primäre Grund für verwendet zwei Zellen.

Würde mich interessieren, wie dieser Blick sich ein wenig mehr Flüssigkeit und weniger buggy in der Benutzeroberfläche. Der Blick, den ich gehe, ist nur wie eBays iOS-app - wechseln Sie zwischen drei verschiedenen Ansichten. Ich muss nur zum wechseln zwischen zwei verschiedenen Ansichten.

  • Haben Sie versucht, deaktivieren Sie die Schaltfläche "layout" für den übergang ist passiert?
  • Das könnte funktionieren - aber fühle ich mich seiner hack. Ich möchte die tradition als ganzes robuster.
  • Es ist nicht ein Angriff auf alle. Wenn Sie darüber nachdenken - Sie nicht wollen, zu übertragen und zurück, während in der Mitte der original-animation.
  • Ich nehme an, du hast Recht. Würde ich es deaktivieren, während der animation und aktivieren Sie in der Abschluss-block?
  • Genau das richtige
Schreibe einen Kommentar