Multiple Section in UICollectionView

冷暖自知 提交于 2020-12-25 05:23:50

问题


I was building an iOS app for my hospital using collection view. However, I need to use multiple sections for the specialist clinic depends on the purpose. I already completed the code if it's just for 1 section. when I try to make it 2 sections, it always returns a nil value.

please check my code below

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)

    if indexPath.section == 0 {
        var buttonSpecialist = cell.viewWithTag(1) as! UIButton

        buttonSpecialist.setTitle(list[indexPath.row].SpecialtyName, for: .normal)

        let btnimg = try? UIImage(data: Data(contentsOf: URL(string: list[indexPath.row].ImageUrl)!))

        var newimg = imageResize(image: btnimg as! UIImage, scaledTo: CGSize(width: 50, height: 50))

        buttonSpecialist.setImage(newimg, for: .normal)
        buttonSpecialist.contentMode = .center
        buttonSpecialist.imageView?.contentMode = .scaleAspectFit

        //let sign: Int = imageOnTop ? 1 : -1
        let imageSize: CGSize? = buttonSpecialist.imageView?.frame.size
        buttonSpecialist.titleEdgeInsets = UIEdgeInsetsMake(((imageSize?.height)! + 5) * 1, -(imageSize?.width)!, 0, 0)
        let titleSize: CGSize? = buttonSpecialist.titleLabel?.bounds.size
        buttonSpecialist.imageEdgeInsets = UIEdgeInsetsMake(-((titleSize?.height)! + 5) * 1, 0, 0, -(titleSize?.width)!)

        cell.layer.borderWidth = 1.0
        cell.layer.borderColor = UIColor.black.cgColor
    }
    else if indexPath.section == 1 {
        var buttonSpecialist = cell.viewWithTag(1) as! UIButton

        buttonSpecialist.setTitle(list2[indexPath.row].SpecialtyName, for: .normal)

        let btnimg = try? UIImage(data: Data(contentsOf: URL(string: list2[indexPath.row].ImageUrl)!))

        var newimg = imageResize(image: btnimg as! UIImage, scaledTo: CGSize(width: 50, height: 50))

        buttonSpecialist.setImage(newimg, for: .normal)
        buttonSpecialist.contentMode = .center
        buttonSpecialist.imageView?.contentMode = .scaleAspectFit

        //let sign: Int = imageOnTop ? 1 : -1
        let imageSize: CGSize? = buttonSpecialist.imageView?.frame.size
        buttonSpecialist.titleEdgeInsets = UIEdgeInsetsMake(((imageSize?.height)! + 5) * 1, -(imageSize?.width)!, 0, 0)
        let titleSize: CGSize? = buttonSpecialist.titleLabel?.bounds.size
        buttonSpecialist.imageEdgeInsets = UIEdgeInsetsMake(-((titleSize?.height)! + 5) * 1, 0, 0, -(titleSize?.width)!)

        cell.layer.borderWidth = 1.0
        cell.layer.borderColor = UIColor.black.cgColor
    }

The main problem here is, I didn't know how to set the specific cell for the specific section. I already using 'IF' inside the function 'cellforindexpath', but it didn't worked.

this is my return number of items in section

func numberOfSections(in collectionView: UICollectionView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 2
}


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of items

    if section == 0 {
        return list.count
    }
        else if section == 1{
            return list2.count
        }

    return 0

}

please help me


回答1:


Make sure assigning DataSource & Delegate to CollectionView

1.Give number of sections you wanna show using below method

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

2.Set item count of each sections for CollectionView using below method.

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
   return (section == 0) ? list.count : list2.count
}

3.Assigning cell for each item to CollectionView.

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    //If you are using multiple cells based on section make condition 

     if indexPath.section == 0 {
             //make sure the identifier of your cell for first section
             let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell1", for: indexPath)
            // do your stuffs
             return cell
     }else{
             //make sure the identifier of your cell for second section
             let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell2", for: indexPath)
            // do your stuffs
             return cell
      }

}



回答2:


If you have different cells layout requirement in that case you should use different custom cells with different reuse identifier. As I can see in your code you have same layout of cell with different datasource.

So I would say try to subclass the collectionview cell and put a IBOutlet property for button through xib or storyboard in the subclass.

You can refer this question: how to create custom UICollectionViewCell



来源:https://stackoverflow.com/questions/44691696/multiple-section-in-uicollectionview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!