简体   繁体   English

Swift 中的集合视图单元格格式不正确

[英]Collection View cell in Swift is not formatting correctly

I am new to Swift and I am trying to create a UICollectionViewCell .我是 Swift 的新手,我正在尝试创建一个UICollectionViewCell It builds successfully but the cells are not the size that I thought I was creating.它构建成功,但单元格不是我认为我正在创建的大小。 There are supposed to be two columns and and it is supposed to contain an image, description and price.应该有两列,并且应该包含图像、描述和价格。 I know it is something simple but I cannot figure out what I am doing wrong.我知道这很简单,但我无法弄清楚我做错了什么。 See the image below.见下图。 I assume I need to fix something in the size inspector but I cannot figure out what.我想我需要在尺寸检查器中修复一些东西,但我不知道是什么。

在此处输入图像描述

import UIKit

class ProductsVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{

    @IBOutlet weak var productsCollection: UICollectionView!

    private(set) public var products = [Product]()

    override func viewDidLoad() {
        super.viewDidLoad()

        productsCollection.dataSource = self
        productsCollection.delegate = self
    }

    func initProducts(category: Category){
        products = DataService.instance.getProducts(forCategoryTitle: category.title)

    }

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ProductCell", for: indexPath) as? ProductCell {
            let product = products[indexPath.row]
            cell.updateViews(product: product)
            return cell
        }
        return ProductCell()
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let height: CGFloat = 280
        return CGSize(width: (collectionView.frame.size.width - 10) / 2, height: height)
        //10 is minimum line spacing between two columns
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 10
    }
}

FYI 供参考

Try this:尝试这个:

// MARK: - UICollectionViewDelegateFlowLayout
extension ViewController: UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        // You can change collection view cell height here, It's up to your design
        let height: CGFloat = 150
        let width: CGFloat = (collectionView.frame.size.width - 10 - a) / 2 // a is extra spacing of collection view (like leading or trailing constraints)
        // Converting CGFloat to Int make sure the width of total cells are less than or equal the screen width
        return CGSize(width: Int(width), height: Int(height)) // 10 is minimum line spacing between two columns
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 10
    }
}

Please check extra spacings example with the below photo:请使用以下照片检查额外间距示例:

a = 20 with my example design (leading = 10, trailing = 10) a = 20 与我的示例设计(前导 = 10,尾随 = 10)

just provide the itemSize when you declare the collectionView :声明collectionView时只需提供itemSize

let layout = UICollectionViewFlowLayout()
layout.itemSize = sizeForEachItem
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM