解决UICollectionView的Cell复用引起的布局混乱问题

//

//  ZHMonthCourseView.swift

//  ZHChat

//

//  Created by Liujc on 2020/10/29.

//  Copyright © 2020 奇异的炸酱面. All rights reserved.

//

importFoundation

importUIKit

importCNSCommon

let kMonthRange = 12

protocol CalendarViewDelegate: class {

    funcdidSelectDate(date:Date)

}

class ZHMonthCourseView: UIView {


    weak var delegate: CalendarViewDelegate?

    varweek: [String] = ["日","一","二","三","四","五","六"]

    let clv = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout())

    private var collectionData = [CalendarLogic]()

    privatevardaraArray: [CalendarLogic] = []

    vardates= [Date]()

    var previousMonthVisibleDatesCount = 0

    var currentMonthVisibleDatesCount = 0

    var nextMonthVisibleDatesCount = 0

    var dataContentArr :[ZHWorkScheduleModle] = []

    varidentifierdic:[String:String] = [:]

    var logic: CalendarLogic? {

        didSet{

            populateDates()

            clv.reloadData()

        }

    }


    //        var selectedDate: Date? {

    //            didSet {

    //                if clv != nil {

    //                    clv.reloadData()

    //                }

    //            }

    //        }


    func populateDates() {

        iflogic!=nil{

            dates= [Date]()


            dates += logic!.previousMonthVisibleDays!

            dates += logic!.currentMonthDays!

            dates += logic!.nextMonthVisibleDays!


            previousMonthVisibleDatesCount = logic!.previousMonthVisibleDays!.count

            currentMonthVisibleDatesCount = logic!.currentMonthDays!.count

            nextMonthVisibleDatesCount = logic!.nextMonthVisibleDays!.count


        }else{

            dates.removeAll(keepingCapacity:false)

        }


    }

    varbaseDate:Date? {

        didSet{


            collectionData= [CalendarLogic]()

            ifletdate =baseDate{

                vardateIter1 = date, dateIter2 = date


                varset =Set()

                set.insert(CalendarLogic(date:baseDate!))


                // advance one year

                (0.._in

                    dateIter1 = dateIter1.firstDayOfFollowingMonth

                    dateIter2 = dateIter2.firstDayOfPreviousMonth


                    set.insert(CalendarLogic(date: dateIter1))

                    set.insert(CalendarLogic(date: dateIter2))

                }

                collectionData=Array(set).sorted(by:<)

            }

            foritemincollectionData{

                print("&&&&&&\(String(describing: item.currentMonthAndYear))")

            }

            self.logic = collectionData[12]

            clv.reloadData()


        }

    }


    var selectedDate: Date? {

        didSet{


            self.clv.reloadData()

            DispatchQueue.main.async{

                ifself.delegate!=nil{

                    self.delegate!.didSelectDate(date:self.selectedDate!)

                }

            }


        }

    }



    overrideinit(frame:CGRect) {

        super.init(frame: frame)

    }


    convenienceinit(frame:CGRect,baseDate:Date, selectedDate:Date) {

        self.init(frame: frame)

        self.baseDate= baseDate

        self.selectedDate= selectedDate

        self.backgroundColor = .white

       // clv.register(ZHDayCourseCell.classForCoder(), forCellWithReuseIdentifier: "ZHDayCourseCell")

        clv.register(ZHWeekHeaderCell.classForCoder(), forSupplementaryViewOfKind:UICollectionElementKindSectionHeader, withReuseIdentifier:"ZHWeekHeaderCell")

        clv.delegate=self

        clv.dataSource=self

        clv.backgroundColor = .white

        self.clv.layer.borderWidth = 0.5

        self.clv.layer.borderColor = UIColor.init(228,235,243).cgColor

        clv.frame=CGRect.init(x:0, y:0, width:CNDevice.screenWidth, height:CNDevice.screenHeight-CNDevice.navBarHeight-72)

        self.addSubview(self.clv)

    }



    requiredinit?(coder aDecoder:NSCoder) {super.init(coder: aDecoder) }


    func refreshData(){



    }

}

extension ZHMonthCourseView:UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{

    funccollectionView(_collectionView:UICollectionView, numberOfItemsInSection section:Int) ->Int{

        // 7*6 = 42 :- 7 columns (7 days in a week) and 6 rows (max 6 weeks in a month)

        return42

    }


    funccollectionView(_collectionView:UICollectionView, cellForItemAt indexPath:IndexPath) ->UICollectionViewCell{


        varid =identifierdic["\(indexPath)"].toString() ??""

        ifid==""{

            id ="ZHDayCourseCell"+"\(indexPath)"

            identifierdic["\(indexPath)"] = id

            collectionView.register(ZHDayCourseCell.classForCoder(), forCellWithReuseIdentifier: id)


        }



        letcell = collectionView.dequeueReusableCell(withReuseIdentifier: id,

                                                      for: indexPath)as!ZHDayCourseCell


        letdate =dates[indexPath.item]

        cell.date= (indexPath.itemnil

        cell.mark= (selectedDate==date)

        cell.disabled = (indexPath.item < previousMonthVisibleDatesCount) ||

            (indexPath.item >= previousMonthVisibleDatesCount

                + currentMonthVisibleDatesCount)

        letcaltimestr =  self.WorkTimedateString(date)


    //    titleArray = ["hello","world","hello","world","hello"]

        if  !cell.disabled{//当月才给赋值

             let  titleArray =  ZHWorkScheduleModle.getTitleArray(DataArray:self.dataContentArr,clendartitle:caltimestr )

             cell.getTitle(titleArr: titleArray)

        }



        print("^^^^^^^^^^\(date)&&&&$$$$$$\(caltimestr)*****\(date.day)*****")

        returncell

    }



    funccollectionView(_collectionView:UICollectionView,

                        didSelectItemAt indexPath:IndexPath) {

        letdate =dates[indexPath.item]

        letcaltimestr =  self.WorkTimedateString(date)

        lettitleArray =  ZHWorkScheduleModle.getTitleArray(DataArray:self.dataContentArr,clendartitle:caltimestr )

        iftitleArray.count>0{

            letvc =  ZHWorkDetailViewController.init()

            vc.dateStr= caltimestr

            self.navigationController?.pushViewController(vc, animated:true)

        }


    }


    funccollectionView(_collectionView:UICollectionView,

                        viewForSupplementaryElementOfKind kind:String,

                        at indexPath:IndexPath) ->UICollectionReusableView{

        switchkind {

        case UICollectionElementKindSectionHeader:

            letheaderView = collectionView.dequeueReusableSupplementaryView(ofKind:UICollectionElementKindSectionHeader,  withReuseIdentifier:"ZHWeekHeaderCell", for: indexPath)

            returnheaderView

        default:

            return UICollectionReusableView.init(frame: CGRect.zero)

        }

    }


    funccollectionView(_collectionView:UICollectionView,

                        layout collectionViewLayout:UICollectionViewLayout,

                        sizeForItemAt indexPath:IndexPath) ->CGSize{

        returnCGSize(width: collectionView.frame.width/7.0, height: collectionView.frame.height/7.0)

    }


    funccollectionView(_collectionView:UICollectionView,

                        layout collectionViewLayout:UICollectionViewLayout,

                        referenceSizeForHeaderInSection section:Int) ->CGSize{

        returnCGSize(width: collectionView.frame.width, height:40)

    }

    funccollectionView(_collectionView:UICollectionView, layout collectionViewLayout:UICollectionViewLayout, insetForSectionAt section:Int) ->UIEdgeInsets{

        returnUIEdgeInsets.init(top:0, left:0, bottom:0, right:0)

    }


    funccollectionView(_collectionView:UICollectionView, layout collectionViewLayout:UICollectionViewLayout, minimumLineSpacingForSectionAt section:Int) ->CGFloat{

        return0

    }


    funccollectionView(_collectionView:UICollectionView, layout collectionViewLayout:UICollectionViewLayout, minimumInteritemSpacingForSectionAt section:Int) ->CGFloat{

        return0

    }

}

extension ZHMonthCourseView:MonthCollectionCellDelegate{


    //MARK: Month cell delegate.

    funcdidSelect(date:Date) {

        selectedDate= date

    }


}

extension ZHMonthCourseView {

    funcWorkTimedateString(_date:Date) ->String{

         letformatter =DateFormatter()

         formatter.locale=Locale.init(identifier:"zh_CN")

         formatter.dateFormat="yyyy-MM-dd"

         letdate = formatter.string(from: date)

         returndate

     }

}

你可能感兴趣的:(解决UICollectionView的Cell复用引起的布局混乱问题)