iOS12 UICollectionView设置estimatedItemSize失效

首先可以确认的是这确实是iOS12的一个Bug,然后这里提供stackoverflow上公布的3个应对方法,各有优缺点,则其一即可解决这个问题。

Solution 1

override func viewDidLoad() {
    super.viewDidLoad()

    //[...]

    for _ in 0 ..< 1000 {
        array.append(randomKeyByBitLength(Int(arc4random_uniform(8)))!)
    }

    DispatchQueue.main.async {
        self.collectionView.collectionViewLayout.invalidateLayout()
    }
}
复制代码

复杂度最高,不推荐

Solution 2

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    collectionView.collectionViewLayout.invalidateLayout()
}
复制代码

该方法最简单,但无法处屏幕理旋转的情况。

Solution 3

class AutoLayoutCollectionView: UICollectionView {

    private var shouldInvalidateLayout = false

    override func layoutSubviews() {
        super.layoutSubviews()
        if shouldInvalidateLayout {
            collectionViewLayout.invalidateLayout()
            shouldInvalidateLayout = false
        }
    }

    override func reloadData() {
        shouldInvalidateLayout = true
        super.reloadData()
    }
}
复制代码

需要将所有UICollectionView设为其子类AutoLayoutCollectionView,如果项目做过类似操作则可以直接修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS的UICollectionView是一种用于展示可滚动内容的高度可定制化的视图控件,而翻书效果是通过使用UICollectionViewFlowLayout结合自定义布局实现的。 要实现翻书效果,我们首先需要创建一个自定义的UICollectionViewFlowLayout。在这个布局中,我们可以定义每个UICollectionViewCell在屏幕上的位置和尺寸。为了实现翻书效果,我们可以使用CATransform3D来对UICollectionViewCell进行3D旋转变换,以模拟翻书的效果。 然后,在设置UICollectionView时,我们需要将我们自定义的布局对象赋值给UICollectionViewFlowLayout属性。接下来,我们可以使用UICollectionViewDataSource和UICollectionViewDelegate方法来填充和管理集合视图中的单元格。 当用户滚动集合视图时,我们可以通过监听UICollectionViewDelegate的方法来获取滚动偏移量,并根据滚动位置计算当前屏幕上显示的单元格。在这个过程中,我们可以根据滚动偏移量来设置每个单元格的旋转角度,以实现翻书的效果。 最后,我们还可以使用手势识别器来实现手势控制翻书效果。用户可以通过左滑或右滑手势来翻动屏幕上的单元格,从而切换到下一页或上一页。 总的来说,要实现iOS上的UICollectionView翻书效果,我们需要自定义UICollectionViewFlowLayout、使用CATransform3D进行单元格的旋转变换,监听滚动偏移量来计算旋转角度,并使用手势识别器来实现手势控制翻书效果。这样,我们就可以在集合视图中实现翻书效果的展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值