我使用具有唯一部分的UICollectionView
来分割大视图的逻辑。这个有HeaderView
有一张照片,我试图让这个标题变得粘稠和有弹性(当你向下滚动标题变得很小,直到只是一个条形并坚持到顶部,当你向上滚动并且反弹,标题回到图片并伸展)。
我已经阅读并观看了许多教程,并尝试自己实现,但每次都发生了相同的行为:
单元格不再滚动,标题向下滑动。
每次我打电话的时候:
collectionViewLayout.invalidateLayout()
集合视图在没有动画的情况下滚动回顶部。
下面,只有弹性部分!
这是我的CustomCollectionViewFlowLayout的代码:
class CustomCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
guard let layoutAttributes = super.layoutAttributesForElements(in: rect),
let collectionView = collectionView else {
return nil
}
let offset = collectionView.contentOffset
if offset.y < 0 {
let deltaY = abs(offset.y)
for attributes in layoutAttributes {
if attributes.representedElementKind == UICollectionElementKindSectionHeader {
var frame = attributes.frame
frame.size.height = max(0, headerReferenceSize.height + deltaY)
frame.origin.y = frame.minY - deltaY
attributes.frame = frame
}
}
}
return layoutAttributes
}
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
}
这是我如何将它与CollectionViewController链接:
override func viewDidLoad() {
super.viewDidLoad()
if let flowLayout = collectionViewLayout as? PINPropertyDetailsCollectionViewFlowLayout {
let side = collectionView?.frame.width ?? 375
flowLayout.headerReferenceSize = CGSize(width: side, height: side)
flowLayout.estimatedItemSize = CGSize(width: side, height: 1)
}
collectionView?.contentInset = UIEdgeInsets(top: -20, left: 0, bottom: 0, right: 0)
}
我尝试使用:
flowLayout.sectionHeadersPinToVisibleBounds = true
以及没有更多结果:没有(单元格或标题)滚动了...
我使用Xcode 9(beta 4)编码iOS 9&amp; 10。
感谢您的反馈:)
答案 0 :(得分:1)
我已通过实施UICollectionViewDelegateFlowLayout
和方法collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
来解决此问题。
如果没有固定的物品尺寸,显然不可能产生弹性效果(直到现在我使用的是自动尺寸)