【问题标题】:Sliding UIView between 2 fixed points在 2 个固定点之间滑动 UIView
【发布时间】:2017-01-01 19:50:05
【问题描述】:

我试图让 UIView 在滑动触摸时在 2 点之间滑动。我试过使用 UIPanGestureRecognizer。滑动很好,但是当视图到达极限点时,会有一个颠簸的跳跃。它不平滑。这是我的手势功能:

    func wasDragged(gestureRecognizer: UIPanGestureRecognizer) {
    if gestureRecognizer.state == UIGestureRecognizerState.began || gestureRecognizer.state == UIGestureRecognizerState.changed {
        let translation = gestureRecognizer.translation(in: self.view)
        print(gestureRecognizer.view!.center.x)
        if(gestureRecognizer.view!.center.x <= self.view.frame.width) && (gestureRecognizer.view!.center.x >= self.view.frame.width - 100) {
            gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y:  gestureRecognizer.view!.center.y)
        }else if (gestureRecognizer.view!.center.x > self.view.frame.width){
            gestureRecognizer.view!.center = CGPoint(x: self.view.frame.width, y: gestureRecognizer.view!.center.y)
        }else if (gestureRecognizer.view!.center.x < self.view.frame.width - 100){
            gestureRecognizer.view!.center = CGPoint(x: self.view.frame.width - 100, y: gestureRecognizer.view!.center.y)
        }

        gestureRecognizer.setTranslation(CGPoint(x: 0,y: 0), in: self.view)
    }


}

有什么帮助吗?谢谢。

【问题讨论】:

  • 您的代码非常有问题。通过使用一些中间局部变量,它可以写得更加整洁和紧凑。您不应该将center 设置为一个点,而将width 设置为一个长度。为什么你的第三个else if 测试中心x 是否小于 小于宽度-100?当然你会跳到宽度 - 100!这就是你的代码所说的。
  • 好的,y 是固定的。我正在使用坐标在 2 个点之间移动 customView:初始视图的宽度和这个宽度 -100。
  • “初始视图的宽度”不是点,不是坐标。这是一个长度。
  • 宽度是一个可以用作x坐标的值。无论如何,问题不在这里。我尝试设置正常坐标,但问题仍然存在。当自定义视图到达边界时,它会向后跳一点。我不想让它跳回来。我希望它是光滑的。我希望你明白我的意思......
  • 好的,让我们专注于跳跃。假设我将视图快速移动到width-105。然后立即将其设置为width-100。那是一个跳跃!我看不出这里有什么惊喜。

标签: ios swift uiview touch slide


【解决方案1】:

您的问题是您正在查看视图现在的位置,而不是应用当前移动后的位置。

我通过引入newx 修复了您的代码,它显示了视图试图移动到的位置。这就是您要约束的值。

@IBAction func wasDragged(gestureRecognizer: UIPanGestureRecognizer) {
    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
        let translation = gestureRecognizer.translation(in: self.view)
        print(gestureRecognizer.view!.center.x)
        let newx = gestureRecognizer.view!.center.x + translation.x

        if(newx <= self.view.frame.width) && (newx >= self.view.frame.width - 100) {
            gestureRecognizer.view!.center = CGPoint(x: newx, y:  gestureRecognizer.view!.center.y)
        }else if (newx > self.view.frame.width){
            gestureRecognizer.view!.center = CGPoint(x: self.view.frame.width, y: gestureRecognizer.view!.center.y)
        }else if (newx < self.view.frame.width - 100){
            gestureRecognizer.view!.center = CGPoint(x: self.view.frame.width - 100, y: gestureRecognizer.view!.center.y)
        }

        gestureRecognizer.setTranslation(CGPoint(x: 0,y: 0), in: self.view)
    }
}

您可能还想考虑更改您的最后一次setTranslation 通话。如果用户尝试将视图向左拖动,然后(不抬起手指)改变方向并向右移动,即使他们的手指不再位于视图上方,您的代码也会将视图向右移动.

通过下面的更改,在用户的手指回到原来的触摸点之前,视图不会向右移动:

gestureRecognizer.setTranslation(CGPoint(x: newx - gestureRecognizer.view!.center.x ,y: 0), in: self.view)

试试看你喜欢哪个。

【讨论】:

  • 我更新了答案以添加关于您最后一次setTranslation 通话的建议。看看吧。
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 2011-04-20
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
相关资源
最近更新 更多