【问题标题】:UIGestureRecognizer in Swift PlaygroundsSwift Playgrounds 中的 UIGestureRecognizer
【发布时间】:2017-03-31 23:45:10
【问题描述】:

我正在尝试将 UIGestureRecognizer 集成到我的快速操场中,这样无论我在操场上点击什么,我的精灵都会到达那个点。我什么都试过了!观看无数的 youtube 视频,并继续堆栈溢出以寻求答案,但每个人都从创建一个名为 view 的类开始,它是一个 UIView,并且在他们的代码中他们一直提到“self”。相反,我创建了一个名为“view”的变量,它是一个 SKView。我尝试获取他们的部分代码,将其放入我的代码中并进行更改,但它不起作用。这是我目前所做的工作。

view.addGestureRecognizer(UIGestureRecognizer(target: view, action:  #selector(handleTap(sender:))))

func handleTap(sender: UITapGestureRecognizer) {
        player.position = sender.location(in: view)
}

我的 Playground 一直告诉我我正在使用未解析的标识符 'handleTap(sender:)'

【问题讨论】:

    标签: swift3 sprite-kit xcode8 uigesturerecognizer swift-playground


    【解决方案1】:

    在 Playground 中具有不同手势识别器状态的 UIGestureRecognizer 示例

    swift3+

    import UIKit
    import PlaygroundSupport
    
    class ViewController : UIViewController {
    
        var yellowView: UIView!
        var redView: UIView!
        var yellowViewOrigin: CGPoint!
    
        override func loadView() {
    
            // UI
    
            let view = UIView()
            view.backgroundColor = .white
    
            yellowView = UIView()
            yellowView.backgroundColor = .yellow
            view.addSubview(yellowView)
    
            redView = UIView()
            redView.backgroundColor = .red
            view.addSubview(redView)
    
            // Layout
            redView.translatesAutoresizingMaskIntoConstraints = false
            yellowView.translatesAutoresizingMaskIntoConstraints = false
            NSLayoutConstraint.activate([
                yellowView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20.0),
                yellowView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0),
                yellowView.heightAnchor.constraint(equalToConstant: 80.0),
                yellowView.widthAnchor.constraint(equalToConstant: 80.0),
    
                redView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20.0),
                redView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20.0),
                redView.heightAnchor.constraint(equalToConstant: 80.0),
                redView.widthAnchor.constraint(equalToConstant: 80.0)
    
                ])
    
            self.view = view
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let pan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePanGesture(_:)))
            yellowView.addGestureRecognizer(pan)
            yellowViewOrigin = yellowView.frame.origin
            view.bringSubview(toFront: yellowView)
        }
    
        @objc func handlePanGesture(_ sender: UIPanGestureRecognizer) {
            let targetView = sender.view!
            let translation = sender.translation(in: view)
    
            switch sender.state {
            case .began,.changed:
                targetView.center = CGPoint(x: targetView.center.x + translation.x
                    ,y: targetView.center.y + translation.y)
                sender.setTranslation(CGPoint.zero, in: view)
            case .ended:
                if targetView.frame.intersects(redView.frame){
                    UIView.animate(withDuration: 0.3) {
                        targetView.alpha = 0.0
                    }
    
                }
                else{
                UIView.animate(withDuration: 0.3) {
                    targetView.frame.origin = self.yellowViewOrigin
                }
                }
                break
            default:
                break
            }
    
        }
    }
    
    PlaygroundPage.current.liveView = ViewController()
    

    【讨论】:

      【解决方案2】:

      我认为您需要在函数声明前添加@objc 标记,以便handleTap#selector 可见。

      @objc func handleTap(sender: UITapGestureRecognizer) {
          player.position = sender.location(in: view) 
      }
      

      【讨论】:

      • 这不起作用,因为我的项目不在类中
      【解决方案3】:

      func handleTap 必须从您的 view 类型中调用。

      请尝试将其添加到 SKView 扩展中:

          extension SKView {
              func handleTap(sender: UITapGestureRecognizer) {
                      player.position = sender.location(in: view)
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多