webentwicklung-frage-antwort-db.com.de

UICollectionView-Zellenabstand basierend auf der Bildschirmgröße des Geräts

Ich habe eine UICollectionView implementiert, die Zellengröße ist w90 h90. Wenn ich es auf dem iPhone 6 starte, bekomme ich den richtigen Abstand zwischen den Zellen, aber wenn ich es auf dem iPhone 5s mache, bekomme ich mehr Abstand zwischen den Zellen. Meine Frage ist, wie ich die Zellengröße basierend auf der Bildschirmgröße des Geräts ändere}. Angenommen, wenn die Zellengröße w80 h80 war, erhalte ich auch auf dem iPhone 5s korrekte Ergebnisse. was ich momentan mache, ist

 override func viewWillAppear(animated: Bool) {

        var scale = UIScreen.mainScreen().scale as CGFloat
        println("Scale :\(scale)")

        var cellSize = (self.collectionViewLayout as UICollectionViewFlowLayout).itemSize
        println("Cell size :\(cellSize)")

        imageSize = CGSizeMake(cellSize.width * scale , cellSize.height * scale)
        println("Image size : \(imageSize)")

    }

// sizeForItemAtIndexPath

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

        return imageSize!

   }

Ergebnis auf dem iPhone 6: enter image description here

Ergebnis auf dem iPhone 5s enter image description here

Objective-C/Swift beide gut für die Lösung . Danke.

21
codeIgnitor

Schritt 1: Implementiere UICollectionViewDelegateFlowLayout (falls nicht erledigt).

Schritt 2: Verwenden Sie die Delegate-Methode von UICollectionViewDelegateFlowLayout.

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/4,120); //use height whatever you wants.
}

Schritt 3: Gehen Sie zu XIB oder StoryBoard, wo Sie Ihre CollectionView haben.

Schritt 4: Klicken Sie in XIB oder StoryBoard, wo Sie Ihre CollectionView haben, auf CollectionView.

Schritt 5: Gehen Sie zu InterfaceBuilder und stellen Sie auf der vorletzten Registerkarte (dh: Größeninspektor) Mindestabstand ein

Für Zellen = 5

Für Zeilen = 5

Dass es.

Anmerkung:

  • Diese Lösung eignet sich für den Fall, dass Sie einen Abstand zwischen cell = 5 herstellen möchten.
  • Wenn Ihr Abstand von 5 abweicht, müssen Sie den Wert 15 in der Delegierungsmethode ändern.
  • Beispiel: Abstand zwischen Zelle = 1, dann Delegat 15 in 10x3 = ändern

return CGSizeMake((UIScreen.mainScreen().bounds.width-30)/4,120);

  • Und setze Minimaler Abstand

For Cells = 10

For Lines = 10

und umgekehrt.

Swift 3 Version

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = UIScreen.main.bounds.width
    return CGSize(width: (width - 10)/3, height: (width - 10)/3) // width & height are the same to make a square cell
}
35
Zaid Pathan

Für eine etwas flexiblere Antwort

Hier können Sie die Anzahl der Spalten und den Abstand anpassen und die Antwort von Zaid Pathan erweitern

// MARK: UICollectionViewDelegateFlowLayout delegate method
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
    let cellSpacing = CGFloat(2) //Define the space between each cell
    let leftRightMargin = CGFloat(20) //If defined in Interface Builder for "Section Insets"
    let numColumns = CGFloat(3) //The total number of columns you want

    let totalCellSpace = cellSpacing * (numColumns - 1)
    let screenWidth = UIScreen.mainScreen().bounds.width
    let width = (screenWidth - leftRightMargin - totalCellSpace) / numColumns
    let height = CGFloat(110) //whatever height you want

    return CGSizeMake(width, height);
}
14
Tim
I wanted 3 item in a section in Both IPad and iPhone. I worked out using the following code. Hope it helps!

1 ) Implement UICollectionViewDelegateFlowLayout delegate


2 )  var device = UIDevice.currentDevice().model

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
    {
        if (device == "iPad" || device == "iPad Simulator")
        {
            return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/3,230)
        }
        return CGSizeMake((UIScreen.mainScreen().bounds.width-10)/3,120)
    }
2
A.G

Objective-c Beispiel:

verwenden Sie diese Funktion

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
     return CGSizeMake(Your desired width, Your desired height);    
    // example: return CGSizeMake(self.view.frame.size.width-20, 100.f);
}
1
Group

Um auf Tims Antwort zu erweitern, gibt es einen kleinen Vorbehalt in Bezug auf Teilpunktbreiten: Durch Runden von Teilpunktbreiten kann die Breite breiter sein als die Anzahl der gewünschten Spalten. Eine Möglichkeit, dies zu umgehen, besteht darin, die Breite mithilfe von trunc () abzuschneiden:

 return CGSizeMake(trunc(width), height)
0
crossroadsman