检查用户是否在连续的UISlider上完成滑动?

win*_*ith 45 cocoa-touch objective-c ios

在我的应用程序中,我有几个UISlider实例来更改各种值.这些值显示在滑块旁边,并在应用程序的另一个可见部分的3d空间中呈现.

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

不过,我更愿意让显示值更新.有没有办法让一个连续的滑块(所以我可以实时更新我的​​价值标签),并在用户完成与之交互后仍然发送某种消息?我现在的直觉是继承UISlider并覆盖该touchesEnded:方法.这可行吗?

Jas*_*ien 76

您可以使用简单的目标/操作执行此操作.

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

  • 遇到了在iOS7中停止工作的同一问题.通过添加UIControlEventTouchCancel修复它 (7认同)
  • 如果用户触摸幻灯片并将手指移开,则不会调用"touchUpInside".然而,滑块只考虑手指的X位置,即使Y现在很远.在这种情况下,也不会调用UIControlEventTouchCancel.除了创建一个在"UIControlEventTouchCancel"期间变为TRUE的BOOL并且在"touchupoutside"或"touchupinside"发生时变为FALSE时,是否有更优雅的方式来处理这个问题? (3认同)

Ste*_*n J 16

我只需要这样做,所以我查找触摸属性,并使用完整的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.
    }

}
Run Code Online (Sandbox Code Playgroud)

:d

  • @ 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: (3认同)
  • 请注意,如果您在Xib中执行此操作,则除了答案中的内容之外,您不需要添加任何代码.这些评论让我觉得有些程序员可能不会阅读这些手册. (2认同)

小智 15

另请注意,您应该连接UIControlEventTouchUpOutside事件,以防用户将手指从控件中拖出,然后再将其抬起.


der*_*iuk 7

在Swift 3中:

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