【问题标题】:Change UISlider value with swipe gesture swift使用滑动手势快速更改 UISlider 值
【发布时间】:2016-09-11 04:58:32
【问题描述】:

我有一个带有滑动手势的 UIView。

 let swipeUpGesture = UISwipeGestureRecognizer(target: self, action: #selector(NextStepCaptureVC.handleSwipeUp(gesture:)))
        swipeUpGesture.direction = .up
        view.addGestureRecognizer(swipeUpGesture)

func handleSwipeUp(gesture: UISwipeGestureRecognizer) {
        print("Swipe Up")
        heightSlider.setValue(20, animated: true)
    }

当我尝试更改它的值时,它会起作用,但值会从 0 跳到 20。我希望值在滑动时不断变化。我该怎么做?

【问题讨论】:

  • 为什么要使用视图并根据视图的滑动来更改滑块?你可以通过滑动直接改变滑块!!!
  • 我知道@KetanParmar。

标签: ios swift uigesturerecognizer uislider


【解决方案1】:

从您的代码来看,您似乎正试图将屏幕上的“上下平移”转换为 UISlider 值的变化。

正如其他人已经提到的,首先是将您的UISwipeGestureRecognizer 更改为UIPanGestureRecognizer

let pan = UIPanGestureRecognizer(target: self, action: #selector(pan(gesture:))) 
view.addGestureRecognizer(pan)

然后在您的平移功能中,您需要根据用户平移的程度来更新滑块值。

func pan(gesture: UIPanGestureRecognizer) {
    // The amount of movement up/down since last change in slider
    let yTranslation = gesture.translation(in: gesture.view).y

    // The slide distance needed to equal one value in the slider
    let tolerance: CGFloat = 5

    if abs(yTranslation) >= tolerance {
        let newValue = heightSlider.value + Float(yTranslation / tolerance)
        heightSlider.setValue(newValue, animated: true)

        // Reset the overall translation within the view
        gesture.setTranslation(.zero, in: gesture.view)
    }
}

只需调整tolerance 变量,使用户滑动更多/更少,以调整滑块值。

【讨论】:

  • 您的答案有效,但是当我向下平移时,值会发生变化。平移时如何使其工作?谢谢@大卫
  • 我的答案适用于上下平移。如果你想反转它移动滑块的方式......将let newValue = heightSlider.value + Float(yTranslation / tolerance)更改为let newValue = heightSlider.value - Float(yTranslation / tolerance)
  • @KerbyJean 弄清楚如何改变滑块的方向对您来说应该不会太难弄清楚。我鼓励您确保您真正了解我提供的代码的所有内容 - 尽量不要只是复制和粘贴它:)
  • 啊哈,我是初学者,但我会尝试 :) 谢谢
  • 如果我的代码对您有用并为您提供了您所追求的解决方案,那么请点赞并将其标记为正确答案:)
【解决方案2】:

你不需要UISwipeGestureRecognizer,你需要UIPanGestureRecognizer。滑动是一次性手势。

Apple's documentation 说“滑动是一种离散的手势,因此每个手势只发送一次相关的动作消息。”

【讨论】:

  • 确实如此,谢谢。但我如何不断改变价值?我想让滑块实时动画。
  • 使用UIPanGestureRecognizer
  • 您使用委托来获取触摸,并通过状态开始/结束/进度监控它们
  • @Yitschak 你能给我一个使用uislider的代码示例吗?谢谢
  • 我不明白你的意思。你在使用 UISlider 吗?如果是这样,您根本不需要任何手势识别器 - UISlider 完成所有工作。如果您使用 UIView 并创建自定义滑块(不是 UISlider),则使用 PanGestureRecognizer。我没有示例代码,但 PanGestureRecognizer 目标的方法会在用户移动手指时连续调用。阅读Apple's documentation
【解决方案3】:

您设置了从手势识别器到代码的主要操作(您可以为此使用界面构建器)

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
    if recognizer.state == UIGestureRecognizerState.Began {
    } else if recognizer.state == UIGestureRecognizerState.Ended {
    } else if recognizer.state == UIGestureRecognizerState.Changed {
    }
}

祝你好运! =]

【讨论】:

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