【问题标题】:Dragging UIView loses the gesture when ended拖动 UIView 结束时会丢失手势
【发布时间】:2016-04-20 12:27:45
【问题描述】:

我有以下拖动 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)

我遗漏了什么使手势与新视图位置保持联系?

谢谢。

【问题讨论】:

    标签: ios swift uiview uigesturerecognizer


    【解决方案1】:

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

    【讨论】:

    • 确实是一个非常有效的观点 - 非常感谢。这似乎有所帮助。我发现了另一个问题,即拖动将视图定位在另一个元素后面,但这是另一个需要解决的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多