it-swarm.com.de

Wie programmiert man UICollectionViewCell Width und Height ein?

Ich versuche, eine CollectionView..__ zu implementieren. Wenn ich Autolayout verwende, ändern meine Zellen nicht die Größe, sondern ihre Ausrichtung.

Nun möchte ich lieber ihre Größe ändern, z.

//var size = CGSize(width: self.view.frame.width/10, height: self.view.frame.width/10)

Ich habe versucht, in meiner CellForItemAtIndexPath einzustellen

collectionCell.size = size

es hat aber nicht funktioniert.

Gibt es einen Weg, dies zu erreichen?

edit :

Es scheint, dass die Antworten nur meine Breite und Höhe von CollectionView selbst ändern. Gibt es Konflikte bei Einschränkungen? Irgendwelche Ideen dazu?

41
JVS

Verwenden Sie diese Methode, um die Breite der benutzerdefinierten Zellenhöhe festzulegen.

Stellen Sie sicher, dass Sie diese Protokolle hinzufügen

UICollectionViewDelegate

UICollectionViewDataSource

UICollectionViewDelegateFlowLayout

Ziel c

@interface YourViewController : UIViewController<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>

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

Swift 4 oder später

extension YourViewController: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
         return CGSize(width: screenWidth, height: screenWidth)
    }

}
80
PinkeshGjr

Stellen Sie sicher, dass Sie das Protokoll UICollectionViewDelegateFlowLayout in Ihre class-Deklaration aufnehmen

class MyCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
{
    //MARK: - UICollectionViewDelegateFlowLayout

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
       return CGSize(width: 100.0, height: 100.0)
    }
}
55
pierre23

Endlich die Antwort ... Sie sollten UICollectionViewDelegateFlowLayout erweitern. 
Dies sollte mit den obigen Antworten funktionieren. 

18
saburo

Schnell 4.1

Sie haben zwei Möglichkeiten, um die Größe von CollectionView zu ändern.
Erster Weg -> füge dieses Protokoll hinzu UICollectionViewDelegateFlowLayout 
für In meinem Fall möchte ich die Zelle in drei Teile in eine Zeile teilen. Ich habe diesen Code unten gemacht

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource ,UICollectionViewDelegateFlowLayout{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    {
            // In this function is the code you must implement to your code project if you want to change size of Collection view
            let width  = (view.frame.width-20)/3
            return CGSize(width: width, height: width)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return collectionData.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
        if let label = cell.viewWithTag(100) as? UILabel {
            label.text = collectionData[indexPath.row]
        }
        return cell
    }
}

Zweitweg -> Sie nicht müssen UICollectionViewDelegateFlowLayout hinzufügen, aber Sie müssen etwas Code in viewDidload-Funktion anstelle des folgenden Codes schreiben

class ViewController: UIViewController {
@IBOutlet weak var collectionView1: UICollectionView!
        var collectionData = ["1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.", "11.", "12."]

    override func viewDidLoad() {
        super.viewDidLoad()
        let width = (view.frame.width-20)/3
        let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = CGSize(width: width, height: width) 
    }
}


extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource {


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return collectionData.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
        if let label = cell.viewWithTag(100) as? UILabel {
            label.text = collectionData[indexPath.row]
        }

        return cell
    }
}

Was auch immer Sie einen Code als ersten oder zweiten Weg schreiben, Sie erhalten dasselbe Ergebnis wie oben. Ich schrieb es. Es hat für mich funktioniert

 enter image description here

7
Sup.Ia

Größenverhältnis entsprechend der iPhone-Größe:

Was Sie tun können, um die Breite und Höhe der Zellen in Bezug auf die iPhone-Größe zu ändern: 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    let width = (self.view.frame.size.width - 12 * 3) / 3 //some width
    let height = width * 1.5 //ratio
    return CGSize(width: width, height: height)
}

Und vielleicht sollten Sie auch Ihre AutoLayout-Einschränkungen für Zelle deaktivieren, damit diese Antwort funktioniert. 

7
AnthoPak

Die Sammlungsansicht hat ein layout Objekt. In Ihrem Fall handelt es sich wahrscheinlich um ein flow-Layout ( UICollectionViewFlowLayout ). Legen Sie die itemSize-Eigenschaft des Ablauflayouts fest. 

6
matt

in Swift3 und Swift4 Sie können die Zellengröße ändern, indem Sie UICollectionViewDelegateFlowLayout hinzufügen und folgende Implementierung vornehmen: 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: 100, height: 100)
    }

oder wenn Sie UICollectionView programmgesteuert erstellen, können Sie dies folgendermaßen tun:

    let layout = UICollectionViewFlowLayout()
                    layout.scrollDirection = .horizontal //this is for direction
                    layout.minimumInteritemSpacing = 0 // this is for spacing between cells
                    layout.itemSize = CGSize(width: view.frame.width, height: view.frame.height) //this is for cell size
let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout)
3
Mohsen mokhtari

Swift4 Swift 4 IOS-Sammlung Ansichtsansicht Beispiel Xcode neueste Code-Arbeitsprobe

Fügen Sie dies im Delegateabschnitt der Oberseite hinzu 

UICollectionViewDelegateFlowLayout 

und benutzen Sie diese Funktion

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = (self.view.frame.size.width - 20) / 3 //some width
    let height = width * 1.5 //ratio
    return CGSize(width: width, height: height)
}

/////sample vollständiger Code

bei Sammlungsansicht erstellen und Sammlungsansichtszelle im Storyboard geben Sie den Verweis auf die Sammlung als an
@IBOutlet schwach var cvContent: UICollectionView!

fügen Sie dies in View Controller ein 

import UIKit

klasse ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

var arrVeg = [String]()
var arrFruits = [String]()
var arrCurrent = [String]()

@IBOutlet weak var cvContent: UICollectionView!



override func viewDidLoad() {
    super.viewDidLoad()
    arrVeg = ["Carrot","Potato", "Tomato","Carrot","Potato", "Tomato","Carrot","Potato", "Tomato","Carrot","Potato", "Tomato"]

    arrVeg = ["Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange","Mango","Papaya","Orange"]


    arrCurrent = arrVeg
}
//MARK: - CollectionView



func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = (self.view.frame.size.width - 20) / 3 //some width
    let height = width * 1.5 //ratio
    return CGSize(width: width, height: height)
}

func numberOfSections(in collectionView: UICollectionView) -> Int {

    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {


    return arrCurrent.count
}



func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ContentCollectionViewCell
    cell.backgroundColor =  UIColor.green
    return cell
}

}

3
Ullas Kumar

Swift 5 programmatisch

lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal

        //Provide Width and Height According to your need
        let cellWidth = UIScreen.main.bounds.width / 10
        let cellHeight = UIScreen.main.bounds.height / 10
        layout.itemSize = CGSize(width: cellWidth, height: cellHeight)

        //You can also provide estimated Height and Width
        layout.estimatedItemSize = CGSize(width: cellWidth, height: cellHeight)

        //For Setting the Spacing between cells
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 0

        return UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    }()
2
Shubham Mishra

Versuchen Sie die Methode unten

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSize(width: 100.0, height: 100.0)
}
2
Nilesh Patel

Eine andere Möglichkeit besteht darin, den Wert direkt im Flow-Layout festzulegen 

    let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: size, height: size)
0
Antzi