菜鸟教程小白 发表于 2022-12-13 02:35:26

ios - 首次加载时 UICollectionView 的 sizeForItemAt 大小错误 - 旋转后它可以工作


                                            <p><p>我有一个 collectionView 设置如下,但在 <code>sizeForItemAt</code> 中 <code>collectionView!.frame.size</code> 与渲染结果不同。</p>

<p>注意:我只对 collectionView 的布局使用约束。</p>

<p>有什么想法吗?</p>

<pre><code>public override init(frame: CGRect){
    super.init(frame: frame)

    self.translatesAutoresizingMaskIntoConstraints = false

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0
    layout.scrollDirection = .vertical

    self.collectionView = UICollectionView(frame: self.frame, collectionViewLayout: layout)
    self.addSubview(self.collectionView!)
    self.collectionView?.translatesAutoresizingMaskIntoConstraints = false
    self.collectionView!.delegate = self
    self.collectionView!.dataSource = self
    self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: &#34;cellIdentifier&#34;)

}

public func collectionView(_ collectionView: UICollectionView,
                                 layout collectionViewLayout: UICollectionViewLayout,
                                 sizeForItemAt indexPath: IndexPath) -&gt; CGSize {

    collectionView!.frame.size // Tot the size of the rendered collectionView, and therefore unable to give the cell the right size???
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这是因为 <code>UICollectionView</code> 中的单元格在 ViewController 的布局完成之前加载。</p>

<p>在使用约束和 Collection View 时,我注意到在 <code>viewDidAppear(:)</code> 调用之前使用 Collection View 大小是不可靠的。</p>

<p>如果你想做一个相对于屏幕尺寸的网格布局,你可以在<code>sizeForItemAt</code>方法中使用<code>UIScreen.main.bounds.size</code>。</p>

<p>在这里,您的 Collection View 似乎是 <code>UIView</code> 子类的 subview 。因此,如果您不能或不想使用屏幕尺寸,您还可以在其 superView 边界更改后重新加载 Collection View :</p>

<pre><code>override var bounds: CGRect {
      didSet {
            if oldValue != bounds {
                self.collectionView?.reloadData()
            }
      }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 首次加载时 UICollectionView 的 sizeForItemAt 大小错误 - 旋转后它可以工作,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/46186086/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/46186086/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 首次加载时 UICollectionView 的 sizeForItemAt 大小错误 - 旋转后它可以工作