[英]How to detect that a UISlider has been tapped using RubyMotion?
我有UISlider:
slider = UISlider.alloc.initWithFrame([[20, 70)], [260, 40]])
我希望能夠檢測用戶何時單擊它並知道在哪里。 我認為我需要使用UITapGestureRecognizer
或類似的工具,但是我很新,對這一切一無所知。
我可以找出滑塊何時被點擊:
slider.addTarget(self, action:'sliderTaped', forControlEvents:UIControlEventTouchDown)
...但是它只能用在拇指上,所以不是很有用,我寧願抓住滑塊上的任何輕按。
任何指向文檔的指針或鏈接將不勝感激。
相關問題/解答,但帶有Objective-c:可點擊的UISlider
要在更改滑塊后得到通知,您需要設置target/action
。 target
是包含要調用的方法的對象,而action
是要調用的方法。 我稱我的action
sliderValueChanged:
您可以選擇任何東西。 請確保在名稱后加上冒號,因為它告訴它將一個指針發送到作為UISlider
對象的發送者。 您需要發送者,以便您可以要求滑塊的值。
如果您沒有為滑塊設置minimumValue
和maximumValue
,則值的范圍為0.0
到1.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.continuous = no
現在,如果您想要一個可單擊的滑塊將拇指移動到單擊的位置,則需要UITapGestureRecognizer
滑塊添加一個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
請注意,此代碼雙擊移動滑塊。 我只單擊一下就遇到了麻煩,因為如果您快速移動拇指,則代碼會將其視為輕擊並將拇指恢復到其初始位置。 設置tapGestureRecognizer.numberOfTapsRequired = 1
可以一次點擊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.