gpt4 book ai didi

iphone - 如何使用 RubyMotion 检测 UISlider 是否被点击?

转载 作者:太空宇宙 更新时间:2023-11-03 16:32:54 25 4
gpt4 key购买 nike

我有 UISlider:

slider = UISlider.alloc.initWithFrame([[20, 70)], [260, 40]])

我希望能够检测到用户何时点击它并知道在何处点击。我想我需要使用 UITapGestureRecognizer 或类似的东西,但我是新手,对这一切一无所知。

我可以通过以下方式了解 slider 何时被轻敲:

slider.addTarget(self, action:'sliderTaped', forControlEvents:UIControlEventTouchDown)

...但它只适用于拇指,所以这不是很有用,我宁愿捕获 slider 上的任何点击。

任何指向文档的指针或链接都将不胜感激。


相关问题/答案,但带有 objective-c:Clickable UISlider

最佳答案

要在 slider 更改时收到通知,您需要设置目标/操作target 是包含您要调用的方法的对象,action 是你想调用的方法。我调用了我的 action sliderValueChanged:。你可以选择任何东西。请务必将冒号附加到名称,因为这会告诉它向发送方发送一个指针,该发送方是 UISlider 对象。您需要发送者,以便您可以请求 slider 的值。

如果您没有为 slider 设置 minimumValuemaximumValue,值的范围将从 0.01.0.

def viewDidLoad
slider = UISlider.alloc.initWithFrame([[20, 70], [260, 40]])
slider.addTarget(self, action:'sliderValueChanged:', forControlEvents:UIControlEventValueChanged)
self.view.addSubview(slider)
end

def sliderValueChanged(sender)
puts sender.value
end

如图所示,sliderValueChanged 将在用户移动 slider 时连续调用。要仅在用户停止触摸 slider 时收到通知,请设置:

slider.continuous = no

现在,如果您想要一个可点击的 slider ,将拇指移动到您点击的位置,那么您需要向 slider 添加一个 UITapGestureRecognizer。此代码演示了这一点:

def viewDidLoad
slider = UISlider.alloc.initWithFrame([[50, 50], [200, 40]])
tapGestureRecognizer = UITapGestureRecognizer.alloc.initWithTarget(self, action:'sliderTapped:')
tapGestureRecognizer.numberOfTapsRequired = 2
slider.addGestureRecognizer(tapGestureRecognizer)

slider.continuous = false
slider.minimumValue = 77
slider.maximumValue = 129
slider.addTarget(self, action:'sliderValueChanged:', forControlEvents:UIControlEventValueChanged)
self.view.addSubview(slider)
end

# This is called when the slider changes either from taps or from moving the thumb
def handle_new_slider_value(value)
puts "New slider value: #{value}"
end

def sliderValueChanged(slider)
handle_new_slider_value(slider.value)
end

# These were determined empirically by setting the thumb to the minimum and
# then clicking on the center and printing out gestureRecognizer.locationInView(slider).x
# and then repeating for the maximum.
SLIDER_MIN = 11
SLIDER_MAX = 189

def sliderTapped(gestureRecognizer)
if gestureRecognizer.state == UIGestureRecognizerStateEnded
slider = gestureRecognizer.view
x = gestureRecognizer.locationInView(slider).x
# Uncomment this to determine values for SLIDER_MIN/SLIDER_MAX
# puts x
x = SLIDER_MIN if x < SLIDER_MIN
x = SLIDER_MAX if x > SLIDER_MAX
slider_min_val = slider.minimumValue
slider_max_val = slider.maximumValue

# Convert from the location in the view to the slider value
slider.value = slider_min_val + (x - SLIDER_MIN) / (SLIDER_MAX - SLIDER_MIN) * (slider_max_val - slider_min_val)
handle_new_slider_value(slider.value)
end
end

请注意,此代码通过双击移动 slider 。我只用一次点击就遇到了麻烦,因为如果你快速移动拇指,代码会将其视为点击并将拇指弹回其起始位置。设置 tapGestureRecognizer.numberOfTapsRequired = 1 以尝试单击。

关于iphone - 如何使用 RubyMotion 检测 UISlider 是否被点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com