捏放大集合视图

时间:2018-02-20 19:12:43

标签: ios swift uicollectionview pinchzoom

我正在尝试在我的收藏视图中添加捏合手势缩放,所以发生的事情是每次从开始时都发生缩放,它不保留以前的比例状态,并且最大和最小比例限制也不起作用 因为我是新手,所以我正在努力解决这个问题,感谢你提前给予的帮助

这是我的集合视图控制器类

import UIKit

class BookViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    @IBOutlet weak var seatMapCollection: UICollectionView!

    @IBAction func pinchGesture(_ sender: UIPinchGestureRecognizer) {

    }

    var dateValue = ["1","2","3","4","10","6","7","8","9","5"]
    var dayValue = ["Mon","Tue","Wed","Thu","Thu","Thu","Thu","Thu","Thu","Thu"]
    var month = ["jan","feb","mar","apr","Thu","Thu","Thu","Thu","Thu","Thu"]

    override func viewDidLoad() {
        super.viewDidLoad()
        self.seatMapCollection.dataSource = self
        self.seatMapCollection.delegate = self
        self.seatMapCollection.maximumZoomScale = 2
        self.seatMapCollection.minimumZoomScale = 0.50
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(pinchAction(sender:)))
        seatMapCollection.addGestureRecognizer(pinchGesture)
        self.view.sendSubview(toBack: seatMapCollection)
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        //return seatmapCollection.numberOfItems(inSection: 150)
        return 15
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 15
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SeatMapCollectionViewCell", for: indexPath) as! SeatMapCollectionViewCell
        return cell
    }

    @objc func pinchAction(sender:UIPinchGestureRecognizer){
        var scaleValue: CGFloat!
        if sender.state == .changed || sender.state == .began {
            if scaleValue == nil{
                seatMapCollection.transform = CGAffineTransform.init(scaleX: sender.scale, y: sender.scale)
                scaleValue = sender.scale
            }else{
                seatMapCollection.transform = CGAffineTransform.init(scaleX: scaleValue, y: scaleValue)
            }
        }
    }
}

这是我的自定义集合视图布局类

import UIKit

class CustomCollectionViewLayout: UICollectionViewLayout {

    let CELL_HEIGHT = 35.0
    let CELL_WIDTH = 35.0
    let STATUS_BAR = UIApplication.shared.statusBarFrame.height

    var cache = [UICollectionViewLayoutAttributes]()
    var contentSize = CGSize.zero
    var cellAttrsDictionary = [UICollectionViewLayoutAttributes]()
    var cellPadding = 5.0

    override var collectionViewContentSize: CGSize {
        return self.contentSize
    }

    var interItemsSpacing: CGFloat = 8

    // 5
    var contentInsets: UIEdgeInsets {
        return collectionView!.contentInset
    }

    override func prepare() {

        // Cycle through each section of the data source.
        if collectionView!.numberOfSections > 0 {
            for section in 0...collectionView!.numberOfSections-1 {

                // Cycle through each item in the section.
                if collectionView!.numberOfItems(inSection: section) > 0 {
                    for item in 0...collectionView!.numberOfItems(inSection: section)-1 {

                        // Build the UICollectionVieLayoutAttributes for the cell.
                        let cellIndex = NSIndexPath(item: item, section: section)
                        let xPos = Double(item) * CELL_WIDTH
                        let yPos = Double(section) * CELL_HEIGHT
                        let frame = CGRect(x: xPos, y: yPos, width: CELL_WIDTH, height: CELL_HEIGHT)
                        let cellFinalAttribute = frame.insetBy(dx:CGFloat(cellPadding) ,dy:CGFloat(cellPadding))
                        let cellAttributes = UICollectionViewLayoutAttributes(forCellWith: cellIndex as IndexPath)
                        cellAttributes.frame = cellFinalAttribute
                        cellAttrsDictionary.append(cellAttributes)

                        // Determine zIndex based on cell type.
                       /* if section == 0 && item == 0 {
                            cellAttributes.zIndex = 4
                        } else if section == 0 {
                            cellAttributes.zIndex = 3
                        } else if item == 0 {
                            cellAttributes.zIndex = 2
                        } else {
                            cellAttributes.zIndex = 1
                        }*/

                        // Save the attributes.
                        //cellAttrsDictionary[cellIndex] = cellAttributes

                    }
                }
            }
        }

        // Update content size.
        let contentWidth = Double(collectionView!.numberOfItems(inSection: 0)) * CELL_WIDTH
        let contentHeight = Double(collectionView!.numberOfSections) * CELL_HEIGHT
        self.contentSize = CGSize(width: contentWidth, height: contentHeight)
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

        // Create an array to hold all elements found in our current view.
        var attributesInRect = [UICollectionViewLayoutAttributes]()

        // Check each element to see if it should be returned.
        for cellAttributes in cellAttrsDictionary {
            if rect.intersects(cellAttributes.frame) {
                attributesInRect.append(cellAttributes)
            }
        }

        // Return list of elements.
        return attributesInRect
    }

    override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
        return false
    }
}

这是我的自定义单元格类

import UIKit

class SeatMapCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var seatDetail: UILabel!

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        setup()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    func setup() {
        self.layer.borderWidth = 1.0
        self.layer.borderColor = UIColor.gray.cgColor
        self.layer.cornerRadius = 5.0

    }
}

0 个答案:

没有答案