gpt4 book ai didi

swift - iOS13 UICollectionViewFlowLayout 子类不接收 collectionView 框架更改

转载 作者:行者123 更新时间:2023-11-28 11:25:37 25 4
gpt4 key购买 nike

我正在测试一些代码,在 iOS13 中,UICollectionViewFlowLayout 似乎没有收到 collectionView 框架中的更改。

下面是一个示例代码,其中我只是根据我在 collectionView 下面的 tableview 中滚动的量来更改 collectionView 的高度:

View Controller

func scrollViewDidScroll(_ scrollView: UIScrollView) {  
collectionView.collectionViewLayout.invalidateLayout()

let totalScroll = scrollView.contentSize.height - scrollView.bounds.size.height
let offset = (scrollView.contentOffset.y)
let percentage = offset / totalScroll

var frame = collectionView.frame
frame.size.height = 40 - (40 * percentage)
collectionView.frame = frame
}

自定义 Collection View 流布局:UICollectionViewFlowLayout

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {  
let attributes = super.layoutAttributesForElements(in: rect)
print(collectionView?.frame)
return attributes
}

iOS 12 及以下版本中 CustomCollectionViewFlowLayout 中的打印语句正确打印出 collectionView.frame 中的更改,即高度实际发生了变化。但在 iOS 13 中,它根本没有反射(reflect)出来。

帮助任何人?

最佳答案

首先,

func scrollViewDidScroll(_ scrollView: UIScrollView) {
collectionView.collectionViewLayout.invalidateLayout()
...
}

看起来很可疑。您确定您的布局应该在 scrollViewDidScroll 函数中失效吗?

有一个适当的地方可以在滚动时使布局失效:

final class CustomCollectionViewFlowLayout: UICollectionViewFlowLayout {

override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
// proper place to invalidate layout while scrolling
}
}

如果您在布局类中使您的布局无效,您将能够正确计算所需的布局容器高度。然后你可以通知你的 Collection View 它的高度应该改变。例如,在一些代表的帮助下:

protocol CustomCollectionViewFlowLayoutSizeDelegate: class {

func newSizeAvailableFor(layout: CustomCollectionViewFlowLayout, progress: CGFloat)
}

final class CustomCollectionViewFlowLayout: UICollectionViewFlowLayout {

weak var sizeDelegate: CustomCollectionViewFlowLayoutSizeDelegate?

override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
// proper place to invalidate layout while scrolling
}
}

final class CustomViewController: CustomCollectionViewFlowLayoutSizeDelegate {

func newSizeAvailableFor(layout: CustomCollectionViewFlowLayout, progress: CGFloat) {
// change collectionView frame
}
}

结论:

您的布局试图监听其容器高度,但其容器高度是根据您的布局计算的。您可以轻松地删除用于高度计算的容器依赖项,或者只为布局提供初始容器高度。最后,布局将负责所有计算。

关于swift - iOS13 UICollectionViewFlowLayout 子类不接收 collectionView 框架更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58295686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com