游乐场中的 UIPanGestureRecognizer

Posted

技术标签:

【中文标题】游乐场中的 UIPanGestureRecognizer【英文标题】:UIPanGestureRecognizer in Playgrounds 【发布时间】:2020-05-18 11:17:08 【问题描述】:

我在玩游乐场(棒极了,对吧?)

如果我想使用模拟器进行捏合手势,我可以使用选项并移动鼠标来执行捏合手势。

相同的组合在 Playgrounds 中没有任何作用。

对于一些示例代码,您可以复制粘贴以下内容:

import UIKit
import PlaygroundSupport

class MyViewController: UIViewController 

    let clickableView = UIView()

    override func loadView() 
        let view = UIView()
        view.backgroundColor = .lightGray

        clickableView.backgroundColor = .blue

        view.addSubview(clickableView)

        clickableView.translatesAutoresizingMaskIntoConstraints = false
        clickableView.widthAnchor.constraint(equalToConstant: 200).isActive = true
        clickableView.heightAnchor.constraint(equalToConstant: 200).isActive = true
        clickableView.centerYAnchor.constraint(equalTo:view.centerYAnchor).isActive = true
        clickableView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        self.view = view
    

    override func viewDidLoad() 
        super.viewDidLoad()
        let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
        clickableView.addGestureRecognizer(pan)

        let pinch = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
        clickableView.addGestureRecognizer(pinch)
    

    @objc func handlePinch(_ sender: UIPinchGestureRecognizer)         
        guard let gestureView = sender.view else 
          return
        

        gestureView.transform = gestureView.transform.scaledBy(
          x: sender.scale,
          y: sender.scale
        )
        sender.scale = 1
    

    @objc func handlePan(_ sender: UIPanGestureRecognizer) 
        guard let targetView = sender.view else return
        let translation = sender.translation(in: view)
        targetView.center = CGPoint(x: targetView.center.x + translation.x
            ,y: targetView.center.y + translation.y)
        sender.setTranslation(CGPoint.zero, in: view)
    


PlaygroundPage.current.liveView = MyViewController()

有没有办法在 Playgrounds 中测试捏合手势?

【问题讨论】:

【参考方案1】:

您实际上可以在游乐场中使用选项键来做两指手势,但这有点挑剔。

    您需要确保先单击实时视图。有时这不起作用 - 如果没有,请继续重新运行您的 Playground,直到您将鼠标悬停在实时视图上时光标变成一个小手。然后单击查看并保留选项。您应该会在鼠标指针周围看到至少一个灰色圆圈。 代表你两根手指的两个灰色圆圈的起始中心点实际上有点奇怪。在我的实验中,它总是在CGPoint(x: 384, y: <half of your live view's height>),可能是因为游乐场使用的设备是 iPad Pro(9.7 英寸),它的屏幕尺寸为 768x1024(和 384 = 768 / 2)。因此,如果您在执行上述 (1) 之后没有看到另一个圆圈,请尝试将您的实时视图放大,例如 768x1024,或者在按住选项的同时使用 shift 键将另一个圆圈拖到视图中。这很棘手,但可以做到;您必须将鼠标移动到实时视图的右侧,按住 option + shift,拖动到实时视图的左侧,释放 shift(但 不是选项),拖动到右侧再次,然后再重复几次,直到看到两个灰色圆圈。

证明这可以在操场上完成:

【讨论】:

以上是关于游乐场中的 UIPanGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章

Swift 游乐场错误:调用中的额外参数“超时”

xcode 游乐场中的 UITableView 不显示文本/字幕

Swift 4.2,Xcode 游乐场中的 String firstIndex() 函数错误

Sources 文件夹中的文件无法访问 Xcode 游乐场中其他文件的公共类或函数

是否可以在 iPad Swift 游乐场应用程序中保存显示在文件应用程序中的文件

El Capitan XCode7.0.1 和 XCode7.1Beta 中的游乐场错误