如何解决在CollectionView中的FadeFlowLayout上启用和禁用淡入淡出效果
当用户开始滚动时,为FadeFlowLayout上的顶部单元格激活淡入淡出效果;当滚动到滚动视图的末尾或开始时,取消激活它。我创建了自定义的Flowlayout,但是它始终使collectionView内的单元格褪色,相反,我希望它仅在用户开始滚动时才具有,并在用户到达scrollview的末尾和用户滚动时禁用底部单元格的褪色回到开始禁用顶部单元衰落。这是我自定义的淡入淡出FlowLayout:
class FadingLayout: UICollectionViewFlowLayout,UICollectionViewDelegateFlowLayout {
private let fadeFactor: CGFloat = 0.5
private let cellHeight : CGFloat = 60.0
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
init(scrollDirection: UICollectionView.ScrollDirection) {
super.init()
self.scrollDirection = scrollDirection
}
override func prepare() {
setupLayout()
super.prepare()
}
func setupLayout() {
self.itemSize = CGSize(width: self.collectionView!.bounds.size.width,height:cellHeight)
self.minimumLineSpacing = 0
let itemWidth = (UIScreen.main.bounds.width - 24) / 2
self.sectionInset = UIEdgeInsets(top: 0,left: 0,bottom: 0,right: 0)
let itemHeight = itemWidth * 0.7
self.itemSize = CGSize(width: itemWidth,height: itemHeight)
self.minimumInteritemSpacing = 8
self.minimumLineSpacing = 8
}
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
func scrollDirectionOver() -> UICollectionView.ScrollDirection {
return UICollectionView.ScrollDirection.vertical
}
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributesSuper: [UICollectionViewLayoutAttributes] = (super.layoutAttributesForElements(in: rect) as [UICollectionViewLayoutAttributes]?)!
if let attributes = NSArray(array: attributesSuper,copyItems: true) as? [UICollectionViewLayoutAttributes]{
var visibleRect = CGRect()
visibleRect.origin = collectionView!.contentOffset
visibleRect.size = collectionView!.bounds.size
for attrs in attributes {
if attrs.frame.intersects(rect) {
let distance = visibleRect.midY - attrs.center.y
let normalizedDistance = abs(distance) / (visibleRect.height * fadeFactor)
let fade = 1 - normalizedDistance
attrs.alpha = fade
}
}
return attributes
}else{
return nil
}
}
override func initialLayoutAttributesForAppearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attributes = super.layoutAttributesForItem(at: itemIndexPath)! as UICollectionViewLayoutAttributes
attributes.alpha = 0
return attributes
}
override func finalLayoutAttributesForDisappearingItem(at itemIndexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
let attributes = super.layoutAttributesForItem(at: itemIndexPath)! as UICollectionViewLayoutAttributes
attributes.alpha = 0
return attributes
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。