菜鸟教程小白 发表于 2022-12-11 19:23:40

ios - CollectionView EstimatedItemSize 不适用于 iOS 9 和 10


                                            <p><p>我遇到了 UICollectionViewFlowLayout.estimatedItemSize 的问题。问题是它不适用于 iOS 9 和 10,但适用于 iOS 11。以下是快照:</p>

<p> <a href="/image/4Vxkx.png" rel="noreferrer noopener nofollow">ScreenShot iOS-11</a> -> 这是预期的行为。 </p>

<p> <a href="/image/LuglP.png" rel="noreferrer noopener nofollow">ScreenShot iOS-10</a> -> 这里没有显示任何内容,因为单元格大小为零。永远不会调用 cellForItemAtIndex。 </p>

<p> <a href="/image/P0mnW.png" rel="noreferrer noopener nofollow">ScreenShot iOS-9</a> -> 与 iOS-10 相同</p>

<p>根据<a href="https://developer.apple.com/videos/play/wwdc2014/226/" rel="noreferrer noopener nofollow">https://developer.apple.com/videos/play/wwdc2014/226/</a> ,
将 <em>estimatedItemSize</em> 设置为非零值,使自动布局启动并在 UICollectionViewCell 上调用 <em>systemLayoutSizeFitting(targetSize:horizo​​ntalFittingPriority:verticalFittingPriority:) -> CGSize</em> 来计算大小。所以 <em>sizeForItemAt</em> 方法不需要实现。</p>

<p>滚动方向是<strong>水平</strong>。</p>

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

<p>这是代码:</p>

<p>UICollectionViewCell:</p>

<pre><code>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
    }
}
</code></pre>

<p> ViewController :</p>

<pre><code>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: = [
      &#34;Lorem&#34;,
      &#34;Lorem ipsu&#34;,
      &#34;Lorem ipsu dolor&#34;,
      &#34;Lorem ipsum dolor sit&#34;,
      &#34;Lorem ipsum dolor sit amet&#34;,
      &#34;Lorem ipsum dolor sit amet, consectetur&#34;,
      &#34;Lorem ipsum dolor sit amet, consectetur adipiscing &#34;,
      &#34;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&#34;,
      &#34;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer&#34;,
      &#34;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ne.&#34;
    ]

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

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

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -&gt; UICollectionViewCell {
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: SingleTextCVC.reuseIdentifier, for: indexPath) as! SingleTextCVC
      cell.textlabel.text = textItems
      return cell
    }
}
</code></pre>

<p>请让我知道我在这里缺少什么?</p>

<p>为什么它只适用于 iOS-11?</p>

<p>这是预期的行为。如果是,为什么?</p>

<p>如果没有,解决办法是什么? </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><pre><code>let layout = UICollectionViewFlowLayout()
if #available(iOS 10.0, *) {
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
}
else {
layout.estimatedItemSize = CGSize(width: 100, height: 52)
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - CollectionView EstimatedItemSize 不适用于 iOS 9 和 10,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47598267/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47598267/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - CollectionView EstimatedItemSize 不适用于 iOS 9 和 10