Я хочу установить высоту коллекции с помощью maxY последней ячейки коллекции! Но почему симулятор SE не работает? - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу установить высоту коллекции с максимальным значением последнего элемента (не прокручиваемым коллекцией / сеткой / фиксированной шириной и высотой).

Я получаю последний индекс элемента и получаю макет последнего элемента, используя collectionView.layoutAttributesForItem(at: lastIndex) и получите maxY предмета и установите для collectionviewHeight значение maxY.

Но только симулятор SE не может найти правильный maxY последнего элемента?!

Я не знаю, почему SE simluator не может найти правильный maxY последней ячейки viewview ...

Вот мой код (полный код на github ):

class CheckListTableViewCell: UITableViewCell {

    var book = Book()

    @IBOutlet weak var bookNameLabel: UILabel!
    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var collectionViewHeight: NSLayoutConstraint!

    var estimateWidth = 30.0
    var cellMarginSize = 3.0

    override func awakeFromNib() {
        super.awakeFromNib()
        setCollectionView()
    }


    func setCollectionView(){
        collectionView.register(UINib(nibName: "PageCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "PageCollectionViewCell")
        self.translatesAutoresizingMaskIntoConstraints = false

        if let flow = collectionView.collectionViewLayout as? UICollectionViewFlowLayout{
            flow.minimumInteritemSpacing = CGFloat(self.cellMarginSize)
            flow.minimumLineSpacing = CGFloat(self.cellMarginSize)
        }

    }

    class func instanceFromNib( _ book:Book)->CheckListTableViewCell{

        let cell = UINib(nibName: "CheckListTableViewCell", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! CheckListTableViewCell
        cell.book = book
        cell.bookNameLabel.text = book.title
        cell.collectionView.reloadData()
        cell.setCollectionViewHeight()
        cell.selectionStyle = UITableViewCell.SelectionStyle.none
        return cell
    }
}


extension CheckListTableViewCell:UICollectionViewDataSource{

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

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

        guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PageCollectionViewCell", for: indexPath) as? PageCollectionViewCell else{
            return UICollectionViewCell()
        }

        let page = book.pageList[indexPath.row]
        cell.pageNumberLabel.text = page.pageNumber
        return cell
    }

}

extension CheckListTableViewCell:UICollectionViewDelegateFlowLayout{

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let width = self.calculateWith()
        return CGSize(width: width, height: width)
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let page = book.pageList[indexPath.row]
        RealmManager.shared.changeIsReadOfPage(title: book.title, pageNumber: page.pageNumber, isRead: !page.isRead)

        if let cell = collectionView.cellForItem(at: indexPath) as? PageCollectionViewCell{
            cell.toggle(isRead:!page.isRead)
        }

    }


}


extension CheckListTableViewCell{

    func calculateWith() -> CGFloat {
        let estimatedWidth = CGFloat(estimateWidth)
        let cellCount = floor(CGFloat(collectionView.frame.size.width / estimatedWidth))

        let margin = CGFloat(cellMarginSize * 2)
        let width = (collectionView.frame.size.width - CGFloat(cellMarginSize) * (cellCount - 1) - margin) / cellCount

        return width
    }


    // it is very clean & simple to set collectionview height with maxY of last collectionview cell
    // But only SE Simulator maxY is not correct why????!

    func setCollectionViewHeight(){

        let lastIndex = IndexPath(item: book.pageList.count-1, section: 0)

        if let att = collectionView.layoutAttributesForItem(at: lastIndex){
            collectionViewHeight.constant = att.frame.maxY
        }
    }
}
...