Swift:如何为CALayer启用捏合缩放?

3

我一直在尝试滚动和缩放CALayer,特别是CAShapeLayer中的几个多边形路径。我将CALayer添加到UIScrollView中,已成功实现对CALayer的滚动。

然而,捏合缩放不起作用。许多教程使用UIScrollViewDelegate实现UIImageView的缩放,大致如下:

@IBOutlet var scrollView : UIScrollView!
var imageView = UIImageView()
scrollView.addSubview(imageView)

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
    return imageView
}

但是CALayer与UIView不兼容,我没有找到任何关于调和这种差异的信息。

在Swift中是否有类似的本地方法来缩放CALayer?这是一件非常简单的事情,还是我漏掉了什么?任何帮助都将不胜感激;如果我错过了明显的问题,请谅解。

2个回答

6

经过一番搜索,我找到了苹果公司相关的文档。原来如果CALayer被正确设置,捏合缩放会自动处理。我按照Swift演示代码做了适当修改,并得到了下面这个基本结构,它对我很有用。

class ViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet var scrollView : UIScrollView!
    var layerView = UIView()
    var shapeLayer= CAShapeLayer()

    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return layerView // Specify the layer to scroll, cannot be the UIScrollView used for scrolling
    }
    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView!, atScale scale: CGFloat) {
        // This was noted as required but no inner code is necessary
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        layerView.layer.addSublayer(shapeLayer) // Attach layer to the canvas view
        scrollView.addSubview(layerView) // Attach the views
        // ... Add layer content, set max and min scaling values as well as layer/view sizes to encompass content
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

我希望这可以帮助其他人!

缺少滚动设置委托? - ingconti

1
感谢上面的解决方案。我刚刚浪费了两个小时,因为委托方法的命名已经改变,而Xcode没有给出任何警告。
现在它是这样的:
func viewForZooming(in: UIScrollView) -> UIView? {
    return activeView
}

也许可以节省两个小时的时间。 :) 如果它被命名为不同的委托,委托将不会被启动,缩放也无法工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接