我使用带有独特部分的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
没有更多的结果:没有(细胞或标题)滚动了...
我在iOS 9和10中使用Xcode 9(beta 4)编码。
感谢您的反馈:)
我通过实施UICollectionViewDelegateFlowLayout
和方法collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
来解决它。
如果没有固定的项目大小,显然不可能产生弹性效果(直到现在我使用的是自动尺寸)