忽略了UICollectionViewCell的自定义高度

问题描述 投票:1回答:3

我已经设置了如下所示的UICollectionView。我试图设置自定义单元格的高度,以使集合在滚动之前适合屏幕上的3个单元格。但是,这种自定义工作无效或似乎被忽略。有人知道我在做什么错吗?

class CoopOverviewViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var CampaignBrandSliderBackground: UIView!
    @IBOutlet weak var CampaignBrandSlider: UISegmentedControl!
    @IBOutlet weak var CampaignCollectionView: UICollectionView!

    // TODO: load real data and replace with campaign model
    let campaignImages: [UIImage] = [UIImage(named: "icon-black")!,UIImage(named: "icon-white")!,UIImage(named: "icon-black")!,UIImage(named: "icon-white")!]
    let apiService = APIService()

    override func viewDidLoad() {
        super.viewDidLoad()
        CampaignBrandSliderBackground.layer.cornerRadius = 10

        // do other stuff...

        // Conform to UICollectionViewDelegate Protocol:
        CampaignCollectionView.dataSource = self
        CampaignCollectionView.delegate = self


        // Adjust Layout of CollectionViewCell: set cell height so that the collection fits 3 cells
        var cellLayout = self.CampaignCollectionView.collectionViewLayout as! UICollectionViewFlowLayout
        cellLayout.itemSize = CGSize(width: self.CampaignCollectionView.frame.size.width, height: self.CampaignCollectionView.frame.size.height/3) 

// ???:自定义高度似乎被忽略了}

    // Conform to UICollectionViewDataSource Protocol:
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return campaignImages.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let campaignCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CampaignTileViewCell", for: indexPath) as! CampaignTileViewCellController
        campaignCell.CampaignBackgroundImage.image = campaignImages[indexPath.item]

        return campaignCell
    }
swift uicollectionview uicollectionviewcell
3个回答
0
投票

您需要在此视图控制器中添加一个扩展名UICollectionViewDelegateFlowLayout。现在,您将必须添加一些回调函数,如下所述。

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width:<your width here>  , height: collectionView.view.bounds.height/3)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

0
投票

您可以尝试以下代码:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
     let marginsAndInsets = inset * 2 + collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right + minimumInteritemSpacing * CGFloat(cellsPerRow - 1)

        //set inset, minimumInteritemSpacing and cellsPerRow globally

        let itemSize = ((collectionView.bounds.size.width - marginsAndInsets) / CGFloat(cellsPerRow)).rounded(.down)

        return CGSize(width: itemSize, height: itemSize)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        //return UIEdgeInsets.zero
        return UIEdgeInsets(top: 0,left: 0,bottom: 0,right: 0);
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0 //minimumInteritemSpacing
    }

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

0
投票

UIUIView>的Estimate Size属性限制了要设置的自定义高度。您可以从情节提要中更新其值。选择UICollectionView-> Size Inspector-> Estimate Size并将其值设置为None。这样,您的自定义高度将像魅力一样发挥作用!

© www.soinside.com 2019 - 2024. All rights reserved.