美文网首页
iOS Swift UICollectionViewCell 滑

iOS Swift UICollectionViewCell 滑

作者: Yuency | 来源:发表于2019-06-13 17:30 被阅读0次

前言:

万万没想到啊,做cell滑动放大的这一天终于还是来了。

Swift
代码地址:https://github.com/gityuency/Autolayout
示例代码类名 【Coll_1_ViewController】 【YXCellScaleFlowLayout】

效果图:

CELL滑动放大.gif

布局代码FlowLayout


import UIKit

class YXCellScaleFlowLayout: UICollectionViewFlowLayout {
    
    private let K_CELL_WIDTH: CGFloat = 260
    
    override init() {
        super.init()
        
        itemSize = CGSize(width: K_CELL_WIDTH, height: 360)
        scrollDirection = .horizontal
        minimumLineSpacing = 0
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return true
    }
    
    var collectionViewFrameWidth: CGFloat = 0 {
        didSet {
            collectionViewFrameWidthHalf = collectionViewFrameWidth / 2
        }
    }
    
    var collectionViewFrameWidthHalf: CGFloat = 0
    
    var collectionViewFrameHeight: CGFloat = 0
    
    var visibleRect = CGRect.zero
    
    func needViewInfo() {
        
        if collectionViewFrameWidth != collectionView?.frame.width {
            collectionViewFrameWidth = collectionView?.frame.width ?? 0
            let offsetXY = (collectionViewFrameWidth - K_CELL_WIDTH) / 2
            sectionInset = UIEdgeInsets(top: 0, left: offsetXY, bottom: 0, right: offsetXY)
        }
        
        if collectionViewFrameHeight != collectionView?.frame.height {
            collectionViewFrameHeight = collectionView?.frame.height ?? 0
        }
    }
    
    
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        
        needViewInfo()
        
        visibleRect.origin = collectionView?.contentOffset ?? CGPoint.zero
        visibleRect.size = collectionView?.frame.size ?? CGSize.zero
        
        let centerX = visibleRect.midX
        
        let array = super.layoutAttributesForElements(in: visibleRect) ?? []
        
        for attributes in array {
            
            let distance = abs(centerX - attributes.center.x)
            
            let scaleRate = distance / (collectionView?.bounds.width ?? 0)
            
            let scale = abs(cos(scaleRate * 1.1))
            
            attributes.transform3D = CATransform3DMakeScale(scale, scale, 1)
            
        }
        return array
    }
    
    override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
        
        let horizontalCenter = proposedContentOffset.x + collectionViewFrameWidthHalf
        
        let targetRect = CGRect(x: proposedContentOffset.x, y: 0.0, width: collectionViewFrameWidth, height: collectionViewFrameHeight)
        
        let array = super.layoutAttributesForElements(in: targetRect) ?? []
        
        var nearestCenterOne = CGFloat(MAXFLOAT)
        
        var shouldBeX: CGFloat = 0
        
        for layoutAttributes in array {
            let currentX = layoutAttributes.center.x
            let currentDistance = abs(currentX - horizontalCenter)
            if currentDistance < nearestCenterOne {
                nearestCenterOne = currentDistance
                shouldBeX = currentX
            }
        }
        
        let X = shouldBeX - collectionViewFrameWidthHalf
        return CGPoint(x: X , y: proposedContentOffset.y)
    }
}



相关文章

网友评论

      本文标题:iOS Swift UICollectionViewCell 滑

      本文链接:https://www.haomeiwen.com/subject/cuxefctx.html