【问题标题】:When is UICollectionViewDelegateFlowLayout function sizeForItemAt called何时调用 UICollectionViewDelegateFlowLayout 函数 sizeForItemAt
【发布时间】:2021-02-02 06:16:37
【问题描述】:

我正在尝试根据方向以编程方式动态更改集合单元格的大小。我曾经使用sizeForItemAt 函数来执行此操作,但我发现它仅在设备方向进入横向模式时才被调用。我应该使用这种方法还是可以使用不同的方法来实现?

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let sectionAttributes = SectionAttributesFactory.createSectionAttributes(for: indexPath.section)
        
        if UIDevice.current.orientation.isLandscape {
            print("Section: \(sectionAttributes.type) | lanscape: \(sectionAttributes.cellLayout.landscapeSize.width)")
        } else {
            print("Section: \(sectionAttributes.type) | portrait: \(sectionAttributes.cellLayout.portraitSize.width)")
        }
}

【问题讨论】:

    标签: ios swift iphone swift5


    【解决方案1】:

    collectionView(_:layout:sizeForItemAt:) 在 vi​​ewController 首次加载和 collectionView 的布局无效时被调用。您通常希望使 viewWillTransition(to:with:) 中的布局无效

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        coordinator.animate(alongsideTransition: { context in
            self.collectionView.collectionViewLayout.invalidateLayout()
        })
    }
    

    然后您可以根据设备方向和视图大小更改单元格大小:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let cellsPerRow = UIDevice.current.orientation.isPortrait ? CGFloat(3.0) : CGFloat(4.0)
        let spacing = layout.minimumInteritemSpacing * (cellsPerRow - 1)
        let cellWidth = (view.frame.size.width - spacing) / cellsPerRow
        return .init(uniform: cellWidth)
    }
    

    【讨论】:

    • 感谢您的帮助!我会研究一下这个函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2019-09-13
    相关资源
    最近更新 更多