2013-01-24 9 views
52

Ich verwende eine UICollectionView mit zwei Prototypzellen. Die Prototypzellen haben unterschiedliche Breiten und enthalten verschiedene Steuerelemente (Bildansicht und Webansicht). Ich gebe definitiv die korrekte Prototypzelle für einen gegebenen Index zurück (alle Zellen zeigen den korrekten Inhalt an), aber die Prototypzellengröße wird ignoriert und die Einzelteilgröße der Sammlungsansicht wird stattdessen benutzt. Es ist nicht so, als würde ich die Größe manuell festlegen. Was ist der Sinn dafür, dass die Prototyp-Zelle im Storyboard skaliert werden kann, wenn die Eigenschaft ignoriert wird, wenn sie tatsächlich angezeigt wird?iOS UICollectionView Prototyp Zellgröße Eigenschaft ignoriert

Antwort

151

Die Größe der Zelle im Storyboard-Editor dient nur dazu, Ihnen beim Entwerfen der Zelle zu helfen. Da jede Prototypzelle eine andere Größe haben kann, weiß UICollectionView nicht, welche Zellengröße für alle Zellen ausgewählt werden muss. Deshalb legen Sie die tatsächliche Größe, die Sie für Ihre Zellen verwenden möchten, separat fest. Sie können dies im Designer tun, indem Sie die Sammlungsansicht auswählen und im Größeninspektor unter der Überschrift "Größe der Sammlungsansicht" die Breite und Höhe der Zellengröße festlegen.

Oder Sie können die folgende Methode überschreiben und ein CGSize-Objekt zurückgeben, das die Größe angibt, die Sie für jede Zelle verwenden möchten. Mit dieser Methode können Sie tatsächlich jede Zelle eine andere Größe sein:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 

Beispiel:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { 
    return CGSizeMake(100, 100); 
} 

Ihre View-Controller ein Delegierter von UICollectionViewDelegateFlowLayout, um für diese Methode sein muss aufgerufen werden. Also vergessen Sie nicht, dass Delegatendeklaration zu Ihrer Ansicht Controller .h-Datei hinzuzufügen, wie zum Beispiel:

@interface MyViewController() <UICollectionViewDelegateFlowLayout> 
+0

Ich verwendete eine benutzerdefinierte Zeichnung, um Farbverlaufslayer, uilabel und uiimage in meiner uicollectionview-Zelle hinzuzufügen, und es zeichnete nicht in der richtigen Größe in meiner uicollection-Ansicht. Durch das Einfügen dieses Codes in meinen Hauptansicht-Controller wurde das Problem behoben. – MGM

+1

Wenn alle Zellen die gleiche Größe haben, ist es effizienter, die Größe in 'UICollectionViewFlowLayout' festzulegen. z.B. 'flow.itemSize = CGSizeMake (50,100);' –

+1

Aber gibt es eine Möglichkeit, programmgesteuert auf die Prototyp-Zelle von der Methode '-collectionView: layout: sizeForItemAtIndexPath: 'zuzugreifen? (Das Entfernen der Zelle unter Verwendung eines Wiederverwendungsbezeichners funktioniert nicht, da dies die Dimensionierungsmethode aufruft, was zu einer Endlosschleife führt.) – erikprice

0

Wenn alle Zellen die gleiche Größe haben, sollten Sie einfach setzen die UICollectionView ‚s Zellgröße Eigenschaften der Wie die Größeneigenschaften von UICollectionViewCell.

17

Wenn alle Zellen die gleiche Größe haben und Sie die itemSize auf dem UICollectionViewFlowLayout

Beispiel festlegen:

((UICollectionViewFlowLayout *) self.collectionViewLayout).itemSize = CGSizeMake(100, 100); 
+2

Scheint, dass collectionViewLayout.itemSize in IOS6 nicht verfügbar ist – Sam

0

Sie Größe UICollectionViewCell in UICollectionView Eigenschaften können.

In Storyboard, wählen Sie Collection View unter Document Outline, dann bearbeiten Sie Ihre Cell Size in Size Inspector.

Und Sie sollten Cell-Size-Typ auf Standard ändern, wenn es Custom ist.

4

Swift, arbeitet für die neuesten iOS.

(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = cellSize 

Ich habe nicht genug Punkte, um Sam zu antworten, aber der Schlüssel ist, dass es nicht UICollectionViewLayout aber UICollectionViewFlowLayout ist.

1

In Swift können Sie die sizeForItemAtIndexPath-Delegate-Methode aufrufen, um die Größe für jede Zelle festzulegen.

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

     if indexPath.row == 0 { 
       // Set the size for cell no. 0 
     }else if indexPath.row == 1 { 
       // Set the size for cell no. 1 
     } 
    } 

Ich hoffe, dass das hilft. Vielen Dank!

0

Verwenden Sie den Standarddelegaten. . .