拖动UIView在结束时丢失手势

时间:2016-04-20 12:27:46

标签: ios swift uiview uigesturerecognizer

我有以下代码来拖动UIView。一切都在视觉上很好。

func moveView(sender: UIPanGestureRecognizer) {
        let translate = sender.translationInView(self.view)
        if sender.state == UIGestureRecognizerState.Changed {
            sender.view!.center = CGPoint(x:sender.view!.center.x + translate.x, y:sender.view!.center.y + translate.y)
            sender.setTranslation(CGPointZero, inView: self.view)
        }
        if sender.state == UIGestureRecognizerState.Ended {
            let newX: CGFloat = sender.view!.center.x + translate.x
            let newY: CGFloat = sender.view!.center.y + translate.y
            sender.view!.center = CGPoint(x:newX, y:newY)
        }
}

然而,在完成此拖动后,视图似乎失去了手势连接,因此我无法再次拖动它或触发与其关联的任何敲击手势等。

如果我添加一个NSLog,我可以看到点击以前视图的位置会触发日志,但是如果我点击实际的当前视图位置则不会。

我建立了在viewDidLoad

中使用以下内容查看thisView的手势
let moveGesture = UIPanGestureRecognizer(target: self, action: Selector("moveView:"))
thisView.addGestureRecognizer(moveGesture)

我错过了什么让手势保持连接到新的视图位置?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为当你调用这个sender.setTranslation(CGPointZero, inView: self.view)时,你应该设置相对于superview而不是视图本身的翻译。相对于自身设置平移会改变视图内容的位置而不是视图区域,这意味着如果将视图图层设置为蒙版到其边界,则不应该看到它在视图之外的任何内容。查看初始区域。
所以你应该做sender.setTranslation(CGPointZero, inView: self.view.superview)