首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CollectionView EstimatedItemSize不为iOS 9和10工作

CollectionView EstimatedItemSize不为iOS 9和10工作
EN

Stack Overflow用户
提问于 2017-12-01 17:13:08
回答 2查看 8.6K关注 0票数 2

我正经历着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上的estimatedItemSize -> CGSize来计算大小。因此,不需要实现sizeForItemAt方法。

滚动方向是水平

FYI -我没有使用UICollectionViewFlowLayoutAutomaticSize,而且还没有尝试过。我不知道它是如何工作的,它只在iOS-10中被引入。但我需要支持iOS-9。此外,根据wwdc2014 2014/226视频,将estimatedItemSize设置为非零值就足够了。

这是代码:

UICollectionViewCell:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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?

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-12-04 10:23:00

代码语言:javascript
复制
let layout = UICollectionViewFlowLayout() 
if #available(iOS 10.0, *) { 
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
 } 
else { 
layout.estimatedItemSize = CGSize(width: 100, height: 52)
 }
票数 3
EN

Stack Overflow用户

发布于 2020-11-13 23:51:48

Swift 5

代码语言:javascript
复制
let layout = UICollectionViewFlowLayout() 
layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
yourCollectionView.collectionViewLayout = layout

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47598267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档