2016-12-08 2 views
4

Ich habe eine Klasse mit der folgenden Erklärung und Baumeister:UICollectionView insetForSectionAtIndex nicht genannt zu werden

class GameView: UIView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout 
{ 
    var collectionView: UICollectionView? 
    var flowLayout = UICollectionViewFlowLayout() 

    init (frame : CGRect, navigationController:UINavigationController, parentViewController: ScrambleViewController) 
{ 
    super.init(frame : frame) 
    cvFrame = CGRect(x: cvLeftBorder, y: cvY, width: Int(UIScreen.main.bounds.width) - (2 * cvLeftBorder), height: cvHeight) 
    collectionView = UICollectionView(frame: cvFrame!, collectionViewLayout: flowLayout); 
    collectionView!.dataSource = self 
    collectionView!.delegate = self; 
    ..... 
} 

Dies ist ein Spiel, wo es eine unterschiedliche Anzahl von Zellen, die jeweils rund ist. Ich möchte die Zellen zu zentrieren, so dass ich eingefügt:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { 

// calculate the insets and return a UIEdgeInsets 
} 

Aus irgendeinem Grund wird die Funktion nie aufgerufen. Ansonsten funktioniert das Programm gut. Oder gibt es eine bessere Möglichkeit, die Zellen in jeder Runde zu zentrieren?

Vielen Dank im Voraus.

+1

Haben Sie den Delegaten und die Datenquelle Ihres collectionView wie yourCollectionView.delegate = self/yourCollecti festgelegt onView.datasource = selbst, wie ich klar sehen kann, dass Sie Protokolle von UICollectionView definiert haben. – Tuhin

+0

Danke @unexpectedNil Ich habe mehr relevanten Code in meinem Beitrag hinzugefügt. Im Code habe ich das UICollectionViewFlowLayout im UICollectionView-Konstruktor übergeben. Ich dachte, so könnte man sicherstellen, dass die Layout-Methoden aufgerufen werden. –

+0

Haben Sie das gelöst? Ich habe das gleiche Problem. – Deco

Antwort

0

Die Signatur hat in Swift 3 geändert:

@available(iOS 6.0, *) 
optional public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets 
5

Dies funktioniert:

@objc(collectionView:layout:insetForSectionAtIndex:) func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets{ 
    return UIEdgeInsetsMake(5, 5, 5, 5) 
} 
+1

Diese Routine wurde nicht aufgerufen, nachdem ich zu Swift 4 konvertiert hatte. Das obige @objc funktionierte für mich. – anorskdev

0

sobremesa Antwort ist richtig, so dass diese Methode Sie etwas davon implementieren verwenden:

public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 
    return yourInsets 
} 
Verwandte Themen