Как динамически увеличить высоту коллекционного элемента xib? - PullRequest
1 голос
/ 22 мая 2019

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

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

Это код MotCollectionViewCell.swift:

import UIKit

protocol ExpandedCellDelegate:NSObjectProtocol{
    func topButtonTouched(indexPath:IndexPath)
}

class MotCollectionViewCell: UICollectionViewCell {

    @IBOutlet var heightConstraint: NSLayoutConstraint!
    @IBOutlet var topButton: UIButton!
    weak var delegate:ExpandedCellDelegate?

    public var indexPath:IndexPath!


    @IBAction func topButtonTouched(_ sender: UIButton) {

        if let delegate = self.delegate{
            delegate.topButtonTouched(indexPath: indexPath)

        }
    }

    @IBOutlet var testLbl: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code    
    }
}

Это код BarChartViewControllerCell.Swift:

import UIKit
import Charts

class BarChartViewController: UIViewController, ChartViewDelegate, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, ExpandedCellDelegate {



    // Bar Chart Properties
    @IBOutlet var barChartView: BarChartView!

    var dataEntry: [BarChartDataEntry] = []

    // Chart Data
    var result =  [String]()
    var mileage = [String]()
    var colours = [UIColor]()

    var list = [Tester]()

    // Collection View properties


    @IBOutlet var collectionView: UICollectionView!

    var expandedCellIdentifier = "MotCollectionViewCell"

    var cellWidth:CGFloat{
        return collectionView.frame.size.width
    }
    var expandedHeight : CGFloat = 258
    var notExpandedHeight : CGFloat = 75

    var dataSource = ["data0","data1","data2","data3","data4"]
    var isExpanded = [Bool]()

    override func viewDidLoad() {
        super.viewDidLoad()

        isExpanded = Array(repeating: false, count: dataSource.count)

        //Register nib cell
        let nibCell = UINib(nibName: expandedCellIdentifier, bundle: nil)
        collectionView.register(nibCell, forCellWithReuseIdentifier: expandedCellIdentifier)

}

  // Collection View functions

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: expandedCellIdentifier, for: indexPath) as! MotCollectionViewCell
        cell.indexPath = indexPath
        cell.delegate = self
        //configure Cell
        return cell

    }

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

        if isExpanded[indexPath.row] == true{
            return CGSize(width: cellWidth, height: expandedHeight)
        }else{
            return CGSize(width: cellWidth, height: notExpandedHeight)
        }

    }

    func topButtonTouched(indexPath: IndexPath) {
        isExpanded[indexPath.row] = !isExpanded[indexPath.row]
        UIView.animate(withDuration: 0.8, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.9, options: UIView.AnimationOptions.curveEaseInOut, animations: {
            self.collectionView.reloadItems(at: [indexPath])
        }, completion: { success in
            print("success")
        })
    }
}

Когда по ячейке щелкают, ячейка расширяется до высоты, которую я объявил константой, и я пытаюсь добиться, чтобы ячейка расширялась в соответствии с данными внутри нее.

...