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

Posted

技术标签:

【中文标题】Swift:如何为 CALayer 启用捏合缩放功能?【英文标题】:Swift: How to enable pinch-to-zoom for CALayer? 【发布时间】:2015-08-25 02:52:48 【问题描述】:

我一直在尝试滚动和缩放多个多边形路径的 CALayer,特别是 CAShapeLayer。我将 CALayer 添加到 UIScrollView 中,该 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?是不是真的很简单让我逃脱了?任何帮助,将不胜感激;如果我遗漏了明显的内容,请道歉。

【问题讨论】:

【参考方案1】:

经过大量挖掘,我找到了相关的documentation from Apple。如果设置正确,CALayers 会自动处理捏合缩放。我为 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()
    

我希望这对其他人有帮助!

【讨论】:

缺少滚动设置委托?【参考方案2】:

感谢上述解决方案。我只是浪费了两个小时,因为委托方法的命名发生了变化,Xcode 没有给出任何警告。

目前是:

func viewForZooming(in: UIScrollView) -> UIView? 
    return activeView

也许会节省两个小时。 :) 如果名称不同,则不会启动委托并且缩放不起作用。

【讨论】:

以上是关于Swift:如何为 CALayer 启用捏合缩放功能?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIWebView 上启用缩放/捏合

在 iOS 10 上的 WKWebView 中打开 PDF 文件时启用捏合缩放手势

如何为 UIPageViewController 中的所有 webViews 文本字体启用缩放

在 webview_flutter 中启用捏合和缩放,在哪里添加代码片段 [this.webView.getSettings().setBuiltInZoomControls(true);]

以编程方式启用/禁用捏合以放大 WKWebView 和 viewForZoomingInScrollView

在 div 内捏合/缩放,但不是整个页面 [关闭]