UICollectionView标头标题更改

时间:2018-07-25 11:11:37

标签: swift uicollectionview uicollectionreusableview

我有一个UICollectionView,带有4个自定义UICollectionViewCellsUICollectionView的标题中有一个UISegmentedControl。我的目标是更改充当标题角色的标题UILabel。现在,如果分段控制值已更改,则将重新加载单元格并切换标题,但该标题与第一个标题重叠。我不知道为什么。

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    if kind == UICollectionElementKindSectionHeader {
        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderDiscoverVC", for: indexPath) as! HeaderDiscoverVC
        headerView.frame = CGRect(x: 0, y: 0, width: collectionView.frame.width, height: 30)
        headerView.backgroundColor = UIColor.hex("d9e2e7")
        let label = UILabel(frame: CGRect(x: 16, y: 0, width: headerView.frame.width, height: 30))

        switch segReusableIdentifier {
        case "Reply":
            label.text = "Reply"
        case "Media":
            label.text = "Media"
        case "Likes":
            label.text = "Likes"
        case "Comments":
            label.text = "Comments"
        default:
            label.text = ""
        }
        label.font = UIFont(name: Fonts.OpenSans_Bold, size: 16)
        label.textColor = UIColor.hex("8a9da6")
        headerView.addSubview(label)
        return headerView
    }

   fatalError("Unexpected element kind")
} 

2 个答案:

答案 0 :(得分:1)

问题在于您将标签添加到标题视图的方式。

您应该将headerView.addSubview(label)放入HeaderDiscoverVC类。还要将颜色和字体设置为相同的类。

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
if kind == UICollectionElementKindSectionHeader {
    let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderDiscoverVC", for: indexPath) as! HeaderDiscoverVC
    headerView.frame = CGRect(x: 0, y: 0, width: collectionView.frame.width, height: 30)

    // MOVE THE COMMENTED LINE TO YOUR HeaderDiscoverVC
    //headerView.backgroundColor = UIColor.hex("d9e2e7")
    headerView.label.frame = CGRect(x: 16, y: 0, width: headerView.frame.width, height: 30)

    switch segReusableIdentifier {
    case "Reply":
        headerView.label.text = "Reply"
    case "Media":
        headerView.label.text = "Media"
    case "Likes":
        headerView.label.text = "Likes"
    case "Comments":
        headerView.label.text = "Comments"
    default:
        headerView.label.text = ""
    }

    // MOVE THE COMMENTED LINES TO YOUR HeaderDiscoverVC
    //label.font = UIFont(name: Fonts.OpenSans_Bold, size: 16)
    //label.textColor = UIColor.hex("8a9da6")
    //headerView.addSubview(label)
    return headerView
}

fatalError("Unexpected element kind")
} 

尝试并分享您的结果

答案 1 :(得分:0)

您正在以编程方式将label添加到headerView中,应在再次添加之前将其删除。 dequeueReusableSupplementaryView请勿删除以编程方式添加的子视图。

在您的代码中:

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    if kind == UICollectionElementKindSectionHeader {
        let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "HeaderDiscoverVC", for: indexPath) as! HeaderDiscoverVC
        headerView.frame = CGRect(x: 0, y: 0, width: collectionView.frame.width, height: 30)
        headerView.backgroundColor = UIColor.hex("d9e2e7")

        ///// Add below code to remove all subviews first before adding any new subview programmatically 
        for label in headerView.subviews {
            if let mylabel = label as? UILabel {
                mylabel.removeFromSuperview()
            }
        }

        ////////////////
        let label = UILabel(frame: CGRect(x: 16, y: 0, width: headerView.frame.width, height: 30))

        switch segReusableIdentifier {
        case "Reply":
            label.text = "Reply"
        case "Media":
            label.text = "Media"
        case "Likes":
            label.text = "Likes"
        case "Comments":
            label.text = "Comments"
        default:
            label.text = ""
        }
        label.font = UIFont(name: Fonts.OpenSans_Bold, size: 16)
        label.textColor = UIColor.hex("8a9da6")
        headerView.addSubview(label)
        return headerView
    }

   fatalError("Unexpected element kind")
} 

更好的方法是将label保留在HeaderDiscoverVC中,并在代码中将其使用为:

 headerView.label.text = "Your data"

通过这种方式,您无需以编程方式删除subViews