模仿扇贝英语的每日一句所做的图片查看器,通过CollectionView + 自定义FlowLayout制作。
效果图:
主要通过重写了
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]?
这个方法
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let array = NSArray(array: super.layoutAttributesForElements(in: rect)!, copyItems:true) as! [UICollectionViewLayoutAttributes]
//可视rect
var visibleRect = CGRect()
visibleRect.origin = self.collectionView!.contentOffset
visibleRect.size = self.collectionView!.bounds.size
//是否右滑
let isRight = self.collectionView!.contentOffset.x - oldOffsetX < 0 ? true : false
//缩放比例
var scling: CGFloat = self.collectionView!.contentOffset.x.truncatingRemainder(dividingBy: self.collectionView!.bounds.width) / collectionView!.bounds.width
//透明比例
let alphaScling = scling
for (index,attributes) in array.enumerated(){
//cell对屏幕中心的距离
let distance = attributes.center.x - visibleRect.midX
if distance > 0 && distance <= visibleRect.width && index != 0{
if newScroll {
scrollState = isRight ? .right : .left
newScroll = false
}
//右滑动 || 右滑未完成 && 左滑完成
if scling <= 0.7 && scrollState == .right {
scling = 0.7
}
//滑动是否完成
if distance == visibleRect.width {
newScroll = true
}
attributes.center = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
attributes.transform = attributes.transform.scaledBy(x: scling, y: scling)
attributes.alpha = alphaScling
//调整层级关系
attributes.zIndex = -1
break
}
}
oldOffsetX = self.collectionView!.contentOffset.x
return array
}
在编写的过程中主要遇到的问题为,当左滑一半右滑的处理和右滑一半左滑的处理,尝试了很多办法才得以解决。最后附上demo地址
https://github.com/px123zx/PictureViewer
如果对该demo有什么好的意见或者建议请与我联系,谢谢