CollectionView EstimatedItemSize 不适用于 iOS 9 和 10

Posted

技术标签:

【中文标题】CollectionView EstimatedItemSize 不适用于 iOS 9 和 10【英文标题】:CollectionView EstimatedItemSize not working for iOS 9 & 10 【发布时间】:2017-12-01 17:13:08 【问题描述】:

我遇到了 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 设置为非零值,使自动布局启动并在 UICollectionViewCell 上调用 systemLayoutSizeFitting(targetSize:horizo​​ntalFittingPriority:verticalFittingPriority:) -> 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
    

视图控制器:

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?

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

如果没有,解决办法是什么?

【问题讨论】:

请查看此链接***.com/questions/25895311/… 【参考方案1】:
let layout = UICollectionViewFlowLayout() 
if #available(iOS 10.0, *)  
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
  
else  
layout.estimatedItemSize = CGSize(width: 100, height: 52)
 

【讨论】:

【参考方案2】:

斯威夫特 5

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

不要忘记设计您的单元格,以便可以通过约束确定其高度。

【讨论】:

以上是关于CollectionView EstimatedItemSize 不适用于 iOS 9 和 10的主要内容,如果未能解决你的问题,请参考以下文章

CollectionView 单元格出现在 collectionView 之外。

CollectionView 里面的 CollectionView | CollectionViewCell 自动布局错误

当collectionView折叠时隐藏collectionView内容

普通 CollectionView 单元格中的动态 CollectionView 单元格

CollectionView 嵌套在 Collectionview 中

- (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath 未调用