2014-01-13 4 views
11

Ich habe eine UICollectionView, die ich eingerichtet habe, funktioniert alles gut (Auswahl, Header usw.), aber ich möchte die Bildlaufrichtung in einigen Situationen ändern.Scroll-Richtung in UICollectionView ändern

Kurz gesagt, wenn ich in das Storyboard gehe und die scrollDirection ändere, funktioniert es gut, aber ich möchte es programmatisch machen!

Ich habe versucht, mit so etwas wie

[myCollectionView setScrollDirection:....and so on....... 

Aber dies funktioniert, kann ich dort finden scrollDirection oder ähnliches nicht die Rolle nicht Richtung der Sammlung Ansicht direkt zu ändern.

Ich habe auch versucht, ein Flusslayout einzurichten, aber ich bin mir sicher, dass ich das falsch mache (d. H. Versuche, ein ViewLayout auf ein FlowLayout zu setzen).

UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init]; 
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; 
    [myCollectionView setCollectionViewLayout:flowLayout]; 

Dieser stürzt mit vielen Constraint Problemen und ich vermute, ich brauche viel mehr Arbeit mit dem Flowlayout zu tun (von dem, was ich gefunden habe, ist es ein bisschen über mir jetzt).

Es sollte auch beachtet werden, dass ich eine benutzerdefinierte Zelle, Kopf- und Fußzeilen verwenden.

Kurz gesagt gibt es einen einfachen Weg, dies zu tun oder nicht? ODER kennt jemand ein gutes Flow Layout Tutorial?

EDIT

I Setup die Auflistungsansicht als solche;

[myCollectionView setDataSource:self]; 
[myCollectionView setDelegate:self]; 

ich diese Delegatmethoden implementieren und alle funktionieren

viewForSupplementaryElementOfKind 
numberOfSectionsInCollectionView 
numberOfItemsInSection 
cellForItemAtIndexPath 
didSelectItemAtIndexPath 

Ich habe die Datasource und Delegierter des .h hinzugefügt und auch die Flow delegieren, aber ich bin nicht sicher, was ich auch für haben sollte Letzteres.

Der Großteil des visuellen Layouts wird in Story Board erledigt, es gibt ein paar Dinge wie Schriftart, Größe und Farbe, die ich programmatisch mache.

ANOTHER EDIT

Dies ist der Fehler, wenn ich versuche, das Flowlayout zu ändern, ich dies auch, wenn ich das Layout versuchen und ungültig machen.

Konnte gleichzeitig Einschränkungen nicht erfüllen. Wahrscheinlich ist mindestens eine der Einschränkungen in der folgenden Liste eine, die Sie nicht möchten. Versuchen Sie Folgendes: (1) Sehen Sie sich jede Einschränkung an und versuchen Sie herauszufinden, was Sie nicht erwarten; (2) finde den Code, der die unerwünschte Einschränkung oder die Nebenbedingungen hinzugefügt hat, und behebe sie. (Hinweis: Wenn Sie sehen NSAutoresizingMaskLayoutConstraints, die Sie nicht verstehen, finden Sie in der Dokumentation für die UIView Eigenschaft translatesAutoresizingMaskIntoConstraints)

"<NSAutoresizingMaskLayoutConstraint:0x89967f0 h=--& v=--& V:[menuCell:0x8991700(50)]>", 
"<NSLayoutConstraint:0x8991200 menuCell:0x8991700.bottom == UILabel:0x8992be0.bottom + 100>", 
"<NSLayoutConstraint:0x898fd50 UILabel:0x8992be0.top == menuCell:0x8991700.top + 3>" 

Wird durch erholen versuchen, Zwang zu brechen

Pause auf objc_exception_throw zu fangen dies im Debugger. Die Methoden in der UIConstraintBasedLayoutDebugging-Kategorie in UIView, die in aufgeführt sind, können ebenfalls hilfreich sein.

+0

Ist die Ansicht, in der die Sammlung im Hinblick auf das UICollectionViewFlowLayoutDelegate Protokoll entsprechen gezogen wird? Sind Sie sicher, dass die Menge an Inhalten, die Sie zeichnen möchten, groß genug ist, um zu gewährleisten, dass die Sammlungsansicht tatsächlich scrollt? Können wir mehr von der Einrichtung der Sammlungsansicht sehen? Sie bewegen sich in die richtige Richtung, indem Sie versuchen, die Bildlaufrichtung auf dem Flow-Layout einzustellen, also guten Start! –

+0

@MatthewHallatt Ich habe ein wenig mehr Info hinzugefügt. Dies ist ein großer Tisch, es könnten 50-60 Gegenstände in 4 oder 5 Teilen sein. Die Sammlungsansicht ist ein langer Balken am unteren Rand, der horizontal scrollt, Button kann angeklickt werden, wodurch die Sammlung fast auf den größten Teil des Bildschirms erweitert wird (was funktioniert), aber ich möchte, dass das Scrollen zum vertikalen Scrollen geht. –

Antwort

0

Ok, versuchen Sie auf Ihre Sammlung Ansicht aufrufen invalidateLayout wie so:

[myCollectionView.collectionViewLayout invalidateLayout]; 

Dies zwingt die Sammlung Ansicht des Layouts zu diesem Zeitpunkt zu aktualisieren (See apple documentation here). Ich bin mir nicht sicher, aber ich kann mir nicht vorstellen, dass dies aufgerufen wird, wenn Sie die Bildlaufrichtung ändern.

Sehen Sie, wenn Sie damit in die Nähe kommen!

+0

Ich habe dies versucht, aber das gleiche Ergebnis, ich habe für Klarheit den gesamten Fehler in meine Frage zu stellen. Ich komme schnell zu dem Punkt, wo ich einfach zwei Ansichten der Sammlung hinzufügen und sie bei Bedarf anzeigen/verstecken werde, aber es scheint eine Verschwendung von Ressourcen zu sein. –

+0

Richten Sie in Ihrer Zelle eigene Einschränkungen ein? Wenn ja, programmatisch oder im Interface Builder? Das Problem scheint zu sein, dass Sie vielleicht versuchen, die Höhe des Etiketts gleich zu halten, aber halten Sie es einen gewissen Abstand vom oberen und unteren Rand der Zelle. Wenn Sie eigene Beschränkungen festlegen, versuchen Sie, die mit der Beschriftung am unteren Rand der Zelle zu entfernen, oder möglicherweise die, die die Höhe der Beschriftung einschränkt. Oder vielleicht habe ich mit diesem ganzen Kommentar den falschen Baum angebellt! –

+0

Es sieht so aus, als wäre alles im Interface Builder erledigt. Es sind keine Einschränkungen in den Einstellungen festgelegt, daher nehme ich an, dass sie automatisch ausgeführt werden. Ich habe versucht, einige, aber das gleiche hinzuzufügen. –

18

dies zu tun:

- (IBAction)changeDirection:(UIButton *)sender 
{ 
    UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout]; 
    if(layout.scrollDirection == UICollectionViewScrollDirectionHorizontal) 
    { 
     layout.scrollDirection = UICollectionViewScrollDirectionVertical; 
    } 
    else 
    { 
     layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 
    } 
} 

Es funktioniert für mich.

+0

Funktioniert immer noch nicht für mich. Auch wenn ich nach der Änderung [Layout invalidateLayout] rufe – Arsynth

+0

Es ist Arbeit, perfekte Lösung: D –

+0

Froh, dass ich helfen kann :) –

4

In swift können Sie dies tun:

//From the collection view subclass 
    if let layout: UICollectionViewFlowLayout = self.collectionViewLayout as? UICollectionViewFlowLayout { 
     layout.scrollDirection = .Vertical 
    }