Swift: 如何为 CALayer 启用双指缩放?
Swift: How to enable pinch-to-zoom for CALayer?
我一直在尝试滚动和缩放多个多边形路径的 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?是真的很简单的东西让我逃避了吗?任何帮助,将不胜感激;很抱歉,如果我遗漏了显而易见的内容。
经过大量挖掘,我找到了相关的 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()
}
}
我希望这对其他人有帮助!
感谢您提供上述解决方案。我只是浪费了两个小时,因为委托方法的命名已经改变并且 Xcode 没有给出任何警告。
目前是:
func viewForZooming(in: UIScrollView) -> UIView? {
return activeView
}
也许会节省两个小时。 :)
如果它的名称不同,则不会启动委托并且缩放不起作用。
我一直在尝试滚动和缩放多个多边形路径的 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?是真的很简单的东西让我逃避了吗?任何帮助,将不胜感激;很抱歉,如果我遗漏了显而易见的内容。
经过大量挖掘,我找到了相关的 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()
}
}
我希望这对其他人有帮助!
感谢您提供上述解决方案。我只是浪费了两个小时,因为委托方法的命名已经改变并且 Xcode 没有给出任何警告。
目前是:
func viewForZooming(in: UIScrollView) -> UIView? {
return activeView
}
也许会节省两个小时。 :) 如果它的名称不同,则不会启动委托并且缩放不起作用。