Swift, использующий оценочный размер элемента для разрыва ячейки во время прокрутки - PullRequest
1 голос
/ 14 апреля 2019

ios версия 11/12

Попытка создать динамическую высоту ячейки для UIViewController (ячейка содержит изображение с фиксированной высотой и метку, которая может быть многострочной, поскольку видовая ячейка метки должна иметь возможность динамически изменять высоту). Я использую раскадровку для создания базового пользовательского интерфейса с некоторыми ограничениями, что делает минимальную ширину ячейки 300.

Получение странного поведения пользовательского интерфейса при вертикальной прокрутке в UIViewController. Размер некоторых ячеек (которых изначально нет в пользовательском интерфейсе) изменен до размера, определенного в ограничениях раскадровки, и игнорируется estimatedItemSize

import UIKit

class StartController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    let offers = SearchCategoryOffer.mockOffers
    @IBOutlet weak var collectionView: UICollectionView!


    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.view.backgroundColor = UIColor.white

        let titleImageView = NavigationImageView()
        titleImageView.image = UIImage(named: "logo")
        navigationItem.titleView = titleImageView

        let w = self.collectionView.frame.width - 30

        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.translatesAutoresizingMaskIntoConstraints = false


        if let layout = self.collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
            layout.sectionInsetReference = .fromLayoutMargins
            layout.sectionInset = UIEdgeInsetsMake(20, 5, 20, 5)
            layout.minimumLineSpacing = 26
            layout.minimumInteritemSpacing = 0
            layout.estimatedItemSize = CGSize(width: w, height: 300) // cell size
        }
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

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

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

        let cell: OfferCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! OfferCell
        cell.listTitle?.text = offers[indexPath.row].name
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let _: OfferCell = collectionView.cellForItem(at: indexPath) as! OfferCell
    }

    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        let _: OfferCell = collectionView.cellForItem(at: indexPath) as! OfferCell
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // bla-bla-bla
    }
}

class NavigationImageView: UIImageView {
    override func sizeThatFits(_ size: CGSize) -> CGSize {
        return CGSize(width: 133, height: 35)
    }
}

enter image description here

...