вставка / удаление разделов в ячейках UICollectionView - PullRequest
0 голосов
/ 07 января 2020

Добрый день,

Я пытаюсь создать расширяемые / складывающиеся ячейки в UICollectionViewController. Клетки расширяются и разрушаются правильно. Однако информация, содержащаяся в каждой ячейке, остается на экране в фоновом режиме. Я покажу картинки, чтобы объяснить. Я пытаюсь удалить информацию из представления, если пользователь сворачивает ячейку, и вставить ее обратно, если пользователь расширяет эту ячейку.

На изображениях ниже express процесс ячейки начинается в свернутом состоянии, расширяется эта ячейка, они снова свертывают эту ячейку. (примечание: это происходит с каждой ячейкой, а не только с первой ячейкой, которую я щелкнул.

первое изображение - это когда изображение загружается и ячейки находятся в исходном свернутом состоянии.

collapsed state

это второе изображение показывает, когда пользователь нажимает на ячейку, чтобы развернуть ее.

expanded cell

третье изображение показывает, когда пользователь пытается свернуть ячейку.

collapsing that cell again

код, который я использую для раскрытия и свертывания ячеек, ниже

fileprivate let cellId = "cellId"
fileprivate let headerId = "headerId"
fileprivate let profID = "profID"
private let headerIdentifier = "userProfileHeader"
private let sectionIdentifier = "sectionHeader"
var section:Int?
var expandSection = [Bool]()
var items = [String]()

    fileprivate func setupCollectionView() {
    collectionView.backgroundColor = .white
    collectionView.contentInsetAdjustmentBehavior = .never
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellId)
    self.expandSection = [Bool](repeating: false, count: self.items.count)
    collectionView.dataSource = self
    collectionView.delegate = self
    collectionView.register(userProfileHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerIdentifier)

    collectionView.register(sectionHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: sectionIdentifier)
}

    fileprivate func registerCollectionView() {

collectionView.register(profCell.self, forCellWithReuseIdentifier: "profCell")
    self.collectionView.register(userProfileHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerIdentifier)

     self.collectionView.register(sectionHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: sectionIdentifier)
}



var headerView: userProfileHeader?
var sectionView: sectionHeader?

override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

    if kind == UICollectionView.elementKindSectionHeader {
         let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerIdentifier, for: indexPath) as? userProfileHeader

        if let user = self.user {
                 headerView?.myUser = user
             } else if let userToLoad = self.userToLoad {
                 headerView?.myUser  = userToLoad
             }

        return headerView!
    } else {

        let sectionViews = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: sectionIdentifier, for: indexPath) as? sectionHeader
        let categories = ["Skills, Preferences", "Bio", "Reviews"]
        sectionViews!.headerLabel.text = categories[indexPath.section]
        sectionViews!.backgroundColor = .lightGray
        return sectionViews!
    }

}

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
    return .init(width: view.frame.width, height: 340)
}

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return items.count
}

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    self.expandSection[indexPath.row] = !self.expandSection[indexPath.row]
    self.collectionView.reloadItems(at: collectionView.indexPathsForSelectedItems!)
}

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

    if indexPath.row == 0 {

        cell.educationView.text = user.education
        cell.skillsView.text = user.skills
        cell.preferencesView.text = "wassup bitches"

    } else if indexPath.row == 1  {

        cell.bioLabel.text = user.bio

    } else if indexPath.row == 2  {

        cell.labels.text = "Reviews"

    }
    }

    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    if self.expandSection[indexPath.row] {
        return CGSize(width: self.view.bounds.width - 20, height: 300)
    }else{
        return CGSize(width: self.view.bounds.width - 20, height: 80)
    }
}

1 Ответ

0 голосов
/ 07 января 2020

Вместо того, чтобы пытаться вставлять и удалять элементы внутри sizeForItemAt(), вызовите reloadSections(_ sections: IndexSet) для секций, которые расширяются или сокращаются. Затем реализуйте numberOfItems(inSection section: Int), чтобы вернуть 0 при контракте или items.count при расширении. Используйте разделы для хранения элементов верхнего уровня, а ячейки - для складных вложенных элементов.

...