UIPanGestureRecognizer处理程序崩溃了我的应用程序 - 迅捷

问题描述 投票:-1回答:1

我有一个包含UIImageView的应用程序。我在父母UIImageView的子视图中画了一个小圆圈。我希望用户能够触摸并拖动主UIImageView中的小蓝圈。我为这个孩子视图设置了一个UIPanGestureRecognizer。我试图测试我的UIPanGestureRecognizer的处理程序是否被解雇,但当我触摸并拖动主UIImageView时,我的应用程序崩溃,出现以下错误:

由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [UIView firstDotHandlerWithSender:]:无法识别的选择器发送到实例0x103507d80'

迅速:

var firstDotView: UIView?
@IBOutlet weak var imgView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    firstDotView = UIView.init()
    firstDotView?.frame = imgView.bounds
    imgView.addSubview(firstDotView!)

    // DRAW A FILLED IN BLUE CIRCLE
    drawBlueCircle()

    imgView.isUserInteractionEnabled = true
    firstDotView?.isUserInteractionEnabled = true

    // ADD GESTURE RECOGNIZER
    let firstDotPanRecgnzr = UIPanGestureRecognizer.init(target: firstDotView!, action: #selector(firstDotHandler(sender:)))
    firstDotView?.addGestureRecognizer(firstDotPanRecgnzr)
}


@objc func firstDotHandler(sender: UIPanGestureRecognizer) -> Void {

    print("translation ...")

    let firstDot = sender.view
    let translation = sender.translation(in: view)

    if(sender.state == .began || sender.state == .changed){
        firstDot?.center = CGPoint.init(x: (firstDot?.center.x)! + translation.x, y: (firstDot?.center.y)! + translation.y)
        sender.setTranslation(CGPoint.zero, in: self.view)
    }
}

func drawBlueCircle(){
    let layer = CAShapeLayer()
    layer.path = UIBezierPath.init(roundedRect: CGRect.init(x: 60, y: 60, width: 30, height: 30), cornerRadius: 50).cgPath
    layer.fillColor = UIColor.blue.cgColor
    firstDotView?.layer.addSublayer(layer)
}
ios swift uipangesturerecognizer
1个回答
3
投票

你的UIPanGestureRecognizer的目标是错误的。

let firstDotPanRecgnzr = UIPanGestureRecognizer(target: self, action: #selector(firstDotHandler(sender:)))

target告诉pan手势选择器所在的位置。我认为你把它混淆了它应该作用于哪个元素。 (我在新的时候犯了同样的错误:D)


来自docs

目标

一个对象,它是接收器识别手势时发送的动作消息的接收者。 nil不是有效值。

© www.soinside.com 2019 - 2024. All rights reserved.