CollectionView EstimatedItemSize不适用于iOS 9& 10

时间:2017-12-01 17:13:09

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewlayout

我遇到了UICollectionViewFlowLayout.estimatedItemSize的问题。问题是它不适用于iOS 9& 10但适用于iOS 11.以下是快照:

ScreenShot iOS-11 - >这是预期的行为。

ScreenShot iOS-10 - >此处没有显示任何内容,因为单元格大小为零。永远不会调用cellForItemAtIndex。

ScreenShot iOS-9 - >与iOS-10相同

根据https://developer.apple.com/videos/play/wwdc2014/226/, 将 estimatedItemSize 设置为非零值,使autolayout启动并调用 systemLayoutSizeFitting(targetSize:horizo​​ntalFittingPriority:verticalFittingPriority :) - >在UICollectionViewCell上使用CGSize 来计算大小。因此无需实现 sizeForItemAt 方法。

滚动方向为水平

仅供参考 - 我没有使用 UICollectionViewFlowLayoutAutomaticSize 并且还没有尝试过。我不确定它是如何工作的,它只在iOS-10中引入。但我需要支持iOS-9。此外,根据wwdc2014 / 226视频,将 estimatedItemSize 设置为非零值应该足够了。

这是代码:

UICollectionViewCell:

class SingleTextCVC: UICollectionViewCell {

    @IBOutlet weak var textlabel: UILabel! {
        didSet {
            textlabel.textColor = UIColor.black
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = UIColor.white
        layer.cornerRadius = 4
        clipsToBounds = true
    }
}

的ViewController:

class CVHorzTextAutoDimenVC: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView! {
        didSet {
            collectionView.delegate = self
            collectionView.dataSource = self
            collectionView.register(nib: SingleTextCVC.self)

            if let _layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {

                _layout.sectionInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16)
                _layout.minimumInteritemSpacing = 16
                _layout.estimatedItemSize = CGSize(width: 100, height: 52)
            }
        }
    }

    fileprivate var textItems: [String] = [
        "Lorem",
        "Lorem ipsu",
        "Lorem ipsu dolor",
        "Lorem ipsum dolor sit",
        "Lorem ipsum dolor sit amet",
        "Lorem ipsum dolor sit amet, consectetur",
        "Lorem ipsum dolor sit amet, consectetur adipiscing ",
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer",
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ne."
    ]

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

extension CVHorzTextAutoDimenVC : UICollectionViewDataSource, UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return textItems.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: SingleTextCVC.reuseIdentifier, for: indexPath) as! SingleTextCVC
        cell.textlabel.text = textItems[indexPath.row]
        return cell
    }
}

请让我知道我在这里失踪了什么?

为什么它仅适用于iOS-11?

这是预期的行为吗?如果是,为什么?

如果没有,解决方案是什么?

2 个答案:

答案 0 :(得分:0)

let layout = UICollectionViewFlowLayout() 
if #available(iOS 10.0, *) { 
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
 } 
else { 
layout.estimatedItemSize = CGSize(width: 100, height: 52)
 }

答案 1 :(得分:0)

雨燕5

let layout = UICollectionViewFlowLayout() 
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
yourCollectionView.collectionViewLayout = layout

别忘了设计单元格,以便可以通过约束条件确定其高度。