2012-01-09 32 views
41

在我的应用程序中,我有几个UISlider实例来更改各种值。这些值显示在滑块旁边,并在应用程序的另一个可见部分中显示在三维空间中。检查用户是否在连续的UISlider上滑动?

3d部分包含一些相当繁重的计算,现在似乎不可能在滑块更改时更新它。这意味着我必须将滑块的continuous属性设置为NO,因此只有在滑块完成更改时才会更新。

但是,我希望显示值更新。有没有办法让滑块连续(所以我可以实时更新我的​​价值标签),并且在用户完成与它的交互后仍然发送某种消息?我现在的直觉是将UISlider划分子类并覆盖touchesEnded:方法。这是可行的吗?

回答

72

你可以用简单的目标/动作来做到这一点。

UIControlEventValueChanged事件设置目标和操作,然后为UIControlEventTouchUpInside事件设置另一个目标和操作。将continuous属性设置为YES时,值更改事件将在滑块更改值时触发,而只有当用户释放控件时触发内部事件才会触发。

+0

感谢。这正是我期待的。突然间, – winsmith 2012-01-09 20:52:57

+1

不再适用于iOS7。 6仍然有效。 – dklt 2013-09-27 08:10:11

+1

@dklt你有没有考虑过在http://bugreport.apple.com上提出bug报告 – Jasarien 2013-09-27 09:12:50

15

另请注意,您应该连接UIControlEventTouchUpOutside事件,以防用户在抬起手指之前将手指拖出控件。

16

我只需要这样做,所以我查了一下touch属性,并使用了完整的IBAction头。

对于想要一些额外控制的人来说,这应该是一个可行的选择,尽管Jas在代码方面肯定更容易。

- (IBAction)itemSlider:(UISlider *)itemSlider withEvent:(UIEvent*)e; 
{ 
    UITouch * touch = [e.allTouches anyObject]; 

    if(touch.phase != UITouchPhaseMoved && touch.phase != UITouchPhaseBegan) 
    { 
     //The user hasn't ended using the slider yet. 
    } 

} 

:d

+0

在两种情况下均可正常工作。我无法相信我不知道还有一个事件参数被发送。 – 2013-10-14 11:54:42

+0

@ alex-i当我应该调用此方法? – user2545330 2013-11-19 14:35:20

+3

@ user2545330'[slider addTarget:@selector(itemSlider:withEvent :) forControlEvents:UIControlEventValueChanged];' - 当滑块值发生变化时,这将调用上面的方法。更多信息:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIControl_Class/Reference/Reference.html#//apple_ref/occ/instm/UIControl/addTarget:action:forControlEvents: – 2013-11-19 14:57:33

4

在夫特3:

@IBAction func sliderValueChanged(_ slider: UISlider, _ event: UIEvent) { 
    guard let touch = event.allTouches?.first, touch.phase != .ended else { 
     // ended 
     return 
    } 
    // not ended yet 
}