it-swarm.com.de

Benutzerdefinierte UICollectionView-Zelle, um die Breite in Swift zu füllen

Ich habe versucht herauszufinden, wie die Zelle die Breite ausfüllen kann. Wie Sie im Bild sehen können, ist die Breite zwischen den Zellen zu groß. Ich verwende eine benutzerdefinierte Zelle mit nur einer Bildansicht.

enter image description here

Ich habe versucht, es vom Storyboard aus anzupassen, aber ich denke, es gibt keine Option dafür oder es sollte programmgesteuert erfolgen. enter image description here

mein UICollectionViewController: 

 @IBOutlet var collectionView2: UICollectionView!

    let recipeImages = ["angry_birds_cake", "creme_brelee", "Egg_benedict", "full_breakfast", "green_tea", "ham_and_cheese_panini", "ham_and_Egg_sandwich", "hamburger", "instant_noodle_with_Egg.jpg", "japanese_noodle_with_pork", "mushroom_risotto", "noodle_with_bbq_pork", "starbucks_coffee", "thai_shrimp_cake", "vegetable_curry", "white_chocolate_donut"]

    override func viewDidLoad() {
        super.viewDidLoad()

        // Uncomment the following line to preserve selection between presentations
        // self.clearsSelectionOnViewWillAppear = false

        // Do any additional setup after loading the view.

    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        //#warning Incomplete method implementation -- Return the number of sections
        return 1
    }


    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        //#warning Incomplete method implementation -- Return the number of items in the section
         return recipeImages.count
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! RecipeCollectionViewCell

        // Configure the cell
        cell.recipeImageView.image = UIImage(named: recipeImages[indexPath.row])

        return cell
    }
33
AaoIi

Sie müssen dies programmgesteuert tun.

Implementieren Sie UICollectionViewDelegateFlowLayout in Ihrem View-Controller und geben Sie die Größe in collectionView:layout:sizeForItemAtIndexPath: an.

func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
        let kWhateverHeightYouWant = 100
        return CGSizeMake(collectionView.bounds.size.width, CGFloat(kWhateverHeightYouWant))
}

Sie möchten auch collectionView.collectionViewLayout.invalidateLayout() in viewWillLayoutSubviews() Ihres View-Controllers aufrufen, damit die Auflistungsansicht neu angeordnet wird, wenn sich die Dimensionen der Hauptansicht ändern (z. B. beim Drehen).

Swift 4 Update

func collectionView(_ collectionView: UICollectionView,
                            layout collectionViewLayout: UICollectionViewLayout,
                            sizeForItemAt indexPath: IndexPath) -> CGSize {
            let kWhateverHeightYouWant = 100
            return CGSize(width: collectionView.bounds.size.width, height: CGFloat(kWhateverHeightYouWant))
}
82
Matthew Quiros

Verwenden Sie den folgenden Code, um die Breite von UICollectionViewCell festzulegen.

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {        
    return CGSize(width: screenWidth/3, height: screenWidth/3);
}
10
Nimit Parekh

Überschreiben Sie in Ihrem View Controller die viewDidLayoutSubviews-Methode

@IBOutlet weak var collectionView: UICollectionView!

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        let itemWidth = view.bounds.width / 3.0
        let itemHeight = layout.itemSize.height
        layout.itemSize = CGSize(width: itemWidth, height: itemHeight)
        layout.invalidateLayout()
    }
}

(collectionView-Eigenschaft ist Ihre collectionView)

10
mustafa

Auch in Swift 3,

Stellen Sie sicher, dass Ihr View-Controller den folgenden Anforderungen entspricht:

UICollectionViewDelegate,
UICollectionViewDataSource,
UICollectionViewDelegateFlowLayout

7
brycejl

Swift 3

Wenn Sie Swift 3 verwenden, verwenden Sie diese Methode:

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {

    }

Beachten Sie die Änderungen:

  1. fügen Sie _ vor collectionView im Methodennamen hinzu
  2. NSIndexPath ändert sich in IndexPath
4
JPetric

Ich habe die gleiche Anforderung, in meinem Fall wird die untenstehende Lösung bearbeitet. Ich setze UIImageView obere, linke, untere und rechte Nebenbedingungen auf 0 inside UICollectionviewCell

@IBOutlet weak var imagesCollectionView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    // flowlayout
    let screenWidth = UIScreen.main.bounds.width
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 10, right: 0)
    layout.itemSize = CGSize(width: screenWidth/3 - 5, height: screenWidth/3 - 5)
    layout.minimumInteritemSpacing = 5
    layout.minimumLineSpacing = 5
    imagesCollectionView.collectionViewLayout = layout

}
1
Raju Abe

Für meinen Fall wollte ich zwei Spalten und drei Zeilen in der UICollectionView anzeigen

Ich habe der Klasse UICollectionViewDelegateFlowLayout-Delegat hinzugefügt

dann überschreibe ich sizeForItemAt indexPath

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let cellHeight = (collectionView.bounds.size.height - 30) / 3 // 3 count of rows to show
    let cellWidth = (collectionView.bounds.size.width - 20) / 2 // 2 count of colomn to show
    return CGSize(width: CGFloat(cellWidth), height: CGFloat(cellHeight))
}

Der 30 ist der Zeilenabstand, der 20 ist der Einzug zwischen den Zellen

0
F.sh

Angenommen, jede Zelle hat eine Breite von 155 und eine Höhe von 220. Wenn ich 2 Zellen pro Zeile im Hochformat und 3 für Querformat anzeigen möchte. 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    var itemsCount : CGFloat = 2.0
    if UIApplication.sharedApplication().statusBarOrientation != UIInterfaceOrientation.Portrait {
        itemsCount = 3.0
    }
    return CGSize(width: self.view.frame.width/itemsCount - 20, height: 220/155 * (self.view.frame.width/itemsCount - 20));
}
0
Eduardo Irias

Setzen Sie die Variable itemSize programmgesteuert auf [UIScreen mainScreen].bounds.size.width/3.

0
rounak

Die beste Lösung ist, das itemSize Ihres UICollectionViewFlowLayout in viewDidLayoutSubviews zu ändern. Dort können Sie die genaueste Größe von UICollectionView ermitteln. Sie müssen Ihr Layout nicht für ungültig erklären, dies wird bereits für Sie erledigt.

0
ZaBlanc