Swift3 Zoom 如何在捏合时更改 UICollectionView 帧大小?

Swift3 Zoom how to change UICollectionView frame size on pinch?

编辑:我已经更新了问题代码,现在它可以帮助任何人。

我在 UICollectionViewCell 中有一个 scrollView,但无法通过捏合在模拟器中使用缩放功能。我可以通过手动缩放视图来实现这一点,但是当用户捏合缩放时,我需要将图像视图框架更改为全尺寸。现在它的尺寸是用框架宽度设置为屏幕宽度和框架高度设置为屏幕高度来填充的。由于图像是正方形,我需要动态更改框架宽度以等于框架高度。

这是我的代码:

import UIKit

class MyCollectionViewCell: UICollectionViewCell, UIScrollViewDelegate {

    let screenWidth = UIScreen.main.bounds.width

    let activityIndicator: UIActivityIndicatorView = {
        let spinner = UIActivityIndicatorView()
        spinner.activityIndicatorViewStyle = .white
        spinner.color = Constants.APP_SPINNER_COLOR
        spinner.hidesWhenStopped = true
        return spinner
    }()

    var zoomScrollView: UIScrollView = {
        let scrollView = UIScrollView()
        scrollView.backgroundColor = .white
        scrollView.minimumZoomScale = 1.0
        scrollView.maximumZoomScale = 6.0
        scrollView.clipsToBounds = true
        scrollView.isUserInteractionEnabled = true
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        return scrollView
    }()

    var itemImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFit
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.backgroundColor = .white
        imageView.isUserInteractionEnabled = true
        return imageView
    }()

    func viewForZooming(in zoomScrollView: UIScrollView) -> UIView? {
        return itemImageView
    }

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

        zoomScrollView.delegate = self

        contentView.backgroundColor = .white

        contentView.addSubview(zoomScrollView)

        zoomScrollView.addSubview(itemImageView)

        itemImageView.addSubview(activityIndicator)


    zoomImageView.frame = CGRect(x:0, y:0, width: screenWidth, height: screenHeight)

    zoomScrollView.frame = itemImageView.frame

        activityIndicator.anchorCenterXToSuperview()
        activityIndicator.anchorCenterYToSuperview()    
    }

    required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
}

您需要设置 scrollView.contentSize 才能使用双指缩放。参见 https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/UIScrollView_pg/CreatingBasicScrollViews/CreatingBasicScrollViews.html

这里做一个滚动视图的简单演示。

Note: Doesn't Give any constraint to image view

滚动视图代码如下:

import UIKit

class ViewController: UIViewController,UIScrollViewDelegate {

    var imgDemo: UIImageView = {
        let img = UIImageView()
        img.contentMode = .scaleAspectFill
        img.isUserInteractionEnabled = true
        return img
    }()


    var scrollView:UIScrollView = {
        let scroll = UIScrollView()
        scroll.maximumZoomScale = 4.0
        scroll.minimumZoomScale = 0.25
        scroll.clipsToBounds = true
        return scroll
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        imgDemo.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height)
        imgDemo.image = UIImage(named: "5.jpg")
        scrollView.delegate = self
        scrollView.frame = imgDemo.frame
        scrollView.addSubview(imgDemo)
        view.addSubview(scrollView)
    }

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return imgDemo
    }

}