一个 UIViewController 中的两个 UICollectionView

Posted

技术标签:

【中文标题】一个 UIViewController 中的两个 UICollectionView【英文标题】:Two UICollectionViews in One UIViewController 【发布时间】:2020-09-28 22:48:46 【问题描述】:

我在一个视图控制器中有两个 UICollectionView,但是我的第一个集合视图符合我的第二个集合视图的委托和数据源。

问题在于类别集合视图符合服务集合视图的大小,并且它试图返回五个单元格。

如何让我的委托和数据源识别并符合两个不同的集合视图?谢谢!

My App Screen Image

// 家庭控制器

private let categoryCollectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 120, height: 120),    
                                                      collectionViewLayout: UICollectionViewFlowLayout())
private let serviceCollectionView = UICollectionView(frame: CGRect(x: 0, y: 0, width: 120, height: 120),
                                                     collectionViewLayout: UICollectionViewLayout())


    fileprivate func configureUI() 
    
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
            
        popularCategoryCardView.addSubview(categoryCollectionView)
        categoryCollectionView.backgroundColor = .white
        categoryCollectionView.collectionViewLayout = layout
        categoryCollectionView.isScrollEnabled = true
        categoryCollectionView.delegate = self
        categoryCollectionView.dataSource = self
        categoryCollectionView.register(CategoryCell.self, forCellWithReuseIdentifier: CellIdentifiers.CategoryCell)
            
        categoryCollectionView.anchor(left: popularCategoryCardView.leftAnchor, bottom: popularCategoryCardView.bottomAnchor,
                                      right: popularCategoryCardView.rightAnchor, paddingLeft: 8, paddingBottom: 8, paddingRight: 8, height: 120)

        popularServiceCardView.addSubview(serviceCollectionView)
        serviceCollectionView.backgroundColor = .white
        serviceCollectionView.collectionViewLayout = layout
        serviceCollectionView.isScrollEnabled = true
        serviceCollectionView.delegate = self
        serviceCollectionView.dataSource = self
        serviceCollectionView.register(ServiceCell.self, forCellWithReuseIdentifier: CellIdentifiers.ServiceCell)
        
        serviceCollectionView.anchor(left: popularServiceCardView.leftAnchor, bottom: popularServiceCardView.bottomAnchor,
                                     right: popularServiceCardView.rightAnchor, paddingLeft: 8, paddingBottom: 8, paddingRight: 8, height: 150) 
    
    

// MARK: - UICollectionViewDataSource

extension HomeController: UICollectionViewDataSource 
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        if collectionView == self.categoryCollectionView 
            return jobCategory.count
         else 
            return 5
        
    
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        if collectionView == self.categoryCollectionView 
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CellIdentifiers.CategoryCell, for: indexPath) as! CategoryCell
            cell.jobCategory = jobCategory[indexPath.item]
            return cell
         else 
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CellIdentifiers.ServiceCell, for: indexPath) as! ServiceCell
            return cell
        
    
    

// MARK: - UICollectionViewDelegateFlowLayout

extension HomeController: UICollectionViewDelegateFlowLayout 
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize 
        if collectionView == self.categoryCollectionView 
            return CGSize(width: 160, height: 120)
         else 
            return CGSize(width: 100, height: 140)
        
    
    

【问题讨论】:

看起来你做了你想要达到的目标 差不多,但是类别集合视图符合服务集合视图的大小,它正在尝试返回五个单元格 我的类别集合视图没有显示五个,但它像滚动一样滚动 【参考方案1】:

不要对多个集合视图使用相同的布局对象:

let categoryLayout = UICollectionViewFlowLayout()
categoryLayout.scrollDirection = .horizontal

categoryCollectionView.collectionViewLayout = categoryLayout

let serviceLayout = UICollectionViewFlowLayout()
serviceLayout.scrollDirection = .horizontal

serviceCollectionView.collectionViewLayout = serviceLayout

【讨论】:

以上是关于一个 UIViewController 中的两个 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

两个 UIViewController 的不同 UITableView 中的一个自定义 UITableViewCell

如何将 UISearchBar 添加到同一 UIViewController 中的两个 TableView

iOS8 中的 UIViewController 自动布局

如何使用 Storyboard 在 iOS 中的 UIViewController 之间切换

UIViewController 推送和弹出中的问题

一个 UIViewController 中的自定义单元格 tableview 和默认 UITableView