iPhone:如何检测滑块拖动的结束?

Dro*_*ven 81 iphone uislider ios4 ios ios5

如何在用户结束拖动滑块指针时检测事件?

Rok*_*arc 151

如果你不需要拖动之间的任何数据,那么你应该简单地设置:

[mySlider setContinuous: NO];
Run Code Online (Sandbox Code Playgroud)

这样,valueChanged只有当用户停止移动滑块时,您才会收到事件.

  • 很棒的答案.这是Swift 4代码:`self.mySlider.isContinuous = false` (3认同)
  • 这是这个问题的最佳答案.我希望我们能改变这个问题的答案. (2认同)
  • 这不是作者要问的。他想连续滑行,也想知道什么时候停止。 (2认同)
  • @lbsweek:OP(作者)询问<quote>如何检测滑块拖动的**结束**</quote>。这个问题的措辞已经没有多少自由解释的回旋余地。 (2认同)
  • 我两者都需要,所以它并不能真正回答问题。 (2认同)
  • 如果您确实需要在拖动之间获取数据怎么办? (2认同)
  • 这并不能回答问题;它只提供了一种在这种情况下有用的解决方法。 (2认同)

pin*_*nch 88

您可以为UIControlEventValueChanged 添加一个带有两个参数(发件人和事件)的操作:

[slider addTarget:self action:@selector(onSliderValChanged:forEvent:) forControlEvents:UIControlEventValueChanged]
Run Code Online (Sandbox Code Playgroud)

然后检查处理程序中触摸对象的阶段:

- (void)onSliderValChanged:(UISlider*)slider forEvent:(UIEvent*)event {     
    UITouch *touchEvent = [[event allTouches] anyObject];
    switch (touchEvent.phase) {     
        case UITouchPhaseBegan:
            // handle drag began
            break;
        case UITouchPhaseMoved:
            // handle drag moved
            break;
        case UITouchPhaseEnded:
            // handle drag ended
            break;
        default:
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特4

slider.addTarget(self, action: #selector(onSliderValChanged(slider:event:)), for: .valueChanged)
Run Code Online (Sandbox Code Playgroud)
@objc func onSliderValChanged(slider: UISlider, event: UIEvent) {
    if let touchEvent = event.allTouches?.first {
        switch touchEvent.phase {
        case .began:
            // handle drag began
        case .moved:
            // handle drag moved
        case .ended:
            // handle drag ended
        default:
            break
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意在Interface Builder中添加操作时,您还可以选择将发件人和事件参数添加到操作中.

  • 完美运作!你从哪里得到的消息来源? (2认同)
  • 谢谢@RoiMulia,我不记得我第一次看到它的地方,我多年来一直在使用滑块.我有时会用它来忽略UITouchPhaseEnded的变化,因为当用户抬起手指时值会跳跃. (2认同)
  • 请记住在UISlider中设置isContinuous = true。 (2认同)
  • 这是一个很好的解决方案,但是它存在触摸取消问题。尽管 touchEvent 枚举中存在“取消”事件,但在取消触摸时不会触发它。因此,我建议还为 Slider 中的 touchCancel 事件添加一个侦听器。这应该涵盖所有可能性。 (2认同)
  • 我发现有时这个阶段可以进行:开始、静止、移动,但然后永远不会结束或取消。这对于我的用例来说是有问题的,因为我预计每次交互都会结束或被取消。修复方法如上所述:使用单独的触摸取消目标/操作。 (2认同)
  • 另请注意,当使用 VoiceOver 递增/递减值时,“allTouches”将为“nil”。 (2认同)

tho*_*mas 69

我使用"Touch Up Inside"和"Touch up outside"通知.

界面生成器:

将Interface Builder中的两个通知连接到您的接收方法.该方法可能如下所示:

- (IBAction)lengthSliderDidEndSliding:(id)sender {
    NSLog(@"Slider did end sliding... Do your stuff here");
}
Run Code Online (Sandbox Code Playgroud)

在代码中:

如果你想以编程方式连接它,你会在viewWillAppear(或适合你的任何地方)调用这样的东西:

[_mySlider addTarget:self
              action:@selector(sliderDidEndSliding:) 
    forControlEvents:(UIControlEventTouchUpInside | UIControlEventTouchUpOutside)];
Run Code Online (Sandbox Code Playgroud)

接收方法如下所示:

- (void)sliderDidEndSliding:(NSNotification *)notification {
     NSLog(@"Slider did end sliding... Do your stuff here");
}
Run Code Online (Sandbox Code Playgroud)


rob*_*off 17

由于UISlider是子类UIControl,您可以为其设置目标和操作UIControlEventTouchUpInside.

如果你想在代码中执行它,它看起来像这样:

[self.slider addTarget:self action:@selector(dragEndedForSlider:)
    forControlEvents:UIControlEventTouchUpInside];
Run Code Online (Sandbox Code Playgroud)

dragEndedForSlider:当触摸结束时,它会向您发送消息.

如果要在笔尖中执行此操作,可以按住Ctrl键单击滑块以获取其连接菜单,然后从"Touch Up Inside"套接字拖动到目标对象.

您还应该为for UIControlEventTouchUpOutside和for 添加目标和操作UIControlEventTouchCancel.

  • 自从我写这个答案以来,"UISlider"的行为发生了变化. (2认同)

Guy*_*her 14

Swift 4和Swift 3

  1. 添加目标touchUpInsidetouchUpOutside事件.您可以以编程方式或从故事板中执行此操作.这是你以编程方式进行的

    slider.addTarget(self, action: #selector(sliderDidEndSliding), for: [.touchUpInside, .touchUpOutside])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编写函数来处理滑块拖动的结束

    func sliderDidEndSliding() {
        print("end sliding")
    }
    
    Run Code Online (Sandbox Code Playgroud)


Mud*_*pai 9

您可以使用:

- (void)addTarget:(id)target action:(SEL)action 
                   forControlEvents:(UIControlEvents)controlEvents  
Run Code Online (Sandbox Code Playgroud)

检测UISlider中何时发生touchDown和touchUp事件


sco*_*ozj 7

我认为你需要控制事件UIControlEventTouchUpInside.


小智 5

斯威夫特 3 个回答

我遇到了同样的问题,最终让它起作用,所以也许它会帮助某人。将 your_Slider 连接到故事板中的“Value Changed”,当滑块移动时“Slider Touched”动作,松开时“Slider Released”。

@IBAction func your_Slider(_ sender: UISlider) {
    if (yourSlider.isTracking) {
        print("Slider Touched")
    } else {
        print("Slider Released")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,但要小心,因为在开始拖动 ** 和 ** 结束拖动时会调用 Slider Released (2认同)