Swift橫向滑動中間大圖左右縮小(UICollectionView+UICollectionViewFlowLayout+UICollectionViewCell)_uicollectionview 水平滾動 中間大-CSDN博客
///根據當前滾動進行對每個cell進行縮放
///用來計算出rect這個范圍內所有cell的UICollectionViewLayoutAttributes,
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
//首先獲取 當前rect范圍內的 attributes對象
let collectionViewLayoutAttributes : [UICollectionViewLayoutAttributes] = super.layoutAttributesForElements(in: rect) ?? [];
//計算縮放比 首先計算出整體中心點的X值 和每個cell的中心點X的值
//用著兩個x值的差值 ,計算出絕對值
//
//計算偏移colleciotnView中心點的X值 = X偏移量+colleciotnView的半寬
let centerX = (collectionView?.contentOffset.x)! + (self.collectionView?.bounds.width)!/2;
// 可見矩陣
let visiableRect = CGRect(x: self.collectionView!.contentOffset.x, y: self.collectionView!.contentOffset.y, width: self.collectionView!.frame.width, height: self.collectionView!.frame.height);
//循環遍歷每個attributes對象 對每個對象進行縮放
for attr : UICollectionViewLayoutAttributes in collectionViewLayoutAttributes {
// 不在可見區域的attributes不變化
if !visiableRect.intersects(attr.frame) {continue}
//計算每個對象cell中心點的X值
let cell_centerX = attr.center.x;
//計算兩個中心點的偏移(距離=cell中心點X值-偏移的colleciotnView中心點X值)取絕對值,這個值應該是一個百位數(iPhone6S的With=375Ppt,偏離量最多375,所以縮放因子設為0.001是適合的)
let distance = abs(cell_centerX-centerX);
//距離越大縮放比越小,距離小 縮放比越大,縮放比最大為1,即重合
let scale:CGFloat = 1/(1+distance*ScaleFactor);
//縮放(基準點為中心點)
//CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz)
//sx:X軸縮放,代表一個縮放比例,一般都是0-1之間的數字。
//sy:Y軸縮放。
//sz:整體比例變換(sx==sy)時
// 1.sz>1,圖形整體縮小;
// 2.0<sz<1,圖形整體放大;
// 3.sz<0,發生關于原點的對稱等比變換。
attr.transform3D = CATransform3DMakeScale(1.0, scale, 1.0);
}
return collectionViewLayoutAttributes;
}
/// - Parameter proposedContentOffset: 當手指滑動的時候 最終的停止的偏移量
/// - Returns: 返回最后位于屏幕最中央的Cell的中心點需要的偏移量
/// 當停止滑動,確保有一Cell是位于屏幕最中央
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
// 可見范圍
let lastRect = CGRect(x: proposedContentOffset.x, y: proposedContentOffset.y, width: self.collectionView!.frame.width, height: self.collectionView!.frame.height)
//獲得collectionVIew中央的X值(即顯示在屏幕中央的X)
let centerX = proposedContentOffset.x + self.collectionView!.frame.width * 0.5;
//這個范圍內所有的屬性
let attributes : [UICollectionViewLayoutAttributes] = self.layoutAttributesForElements(in: lastRect)!;
//需要移動的距離
var adjustOffsetX = CGFloat(MAXFLOAT);
var tempOffsetX : CGFloat;
for attr in attributes {
//計算出距離中心點 最小的那個cell 和整體中心點的偏移
tempOffsetX = attr.center.x - centerX;
if abs(tempOffsetX) < abs(adjustOffsetX) {
adjustOffsetX = tempOffsetX;
}
}
//偏移坐標
return CGPoint(x: (proposedContentOffset.x + adjustOffsetX), y: proposedContentOffset.y);
}