NSSlider实现捕捉滑动开始时刻和结束时刻的方法,以及进行点击跳转

   NSSlider是iOS原生的一个进度控制控件,一般使用的时候是通过给这个slider添加响应方法:
<span style="font-size:18px;">[self.progressSlider addTarget:self action:@selector(adjustMusicProgress:) forControlEvents:(UIControlEventValueChanged)];</span>


   1、捕捉结束时刻:

    从UIControl派生的子类都可以使用addTarget:....方法,对于slider来说关键是响应的事件类型UIControlEventValueChanged, 

这样在默认情况下,当你滑动的时候,slidervalue时不断改变的,它会不断的触发响应方法,也就是target会不断的调用action方法。但是有些时候,我们不需要它不断的调用,只需要在我们滑动结束、手离开的时候才去触发响应事件,也就是捕捉滑动结束时刻的方法,怎么做?

    UISlider本身有个属性continuous,设成NO,就会在结束滑动时触发一次响应事件,而不会一直触发。

    2、捕捉开始时刻:

    有时可能需要用到这个特殊的时刻,毕竟滑动有一个过程,假如在这个过程中有其他的东西在影响滑块的位置,那么需要在滑动开始那一刻把这个影响的东西暂停,比如一个计时器,那就需要这个时刻。原生的没有这个方法,觉得KVO的改变都可以提供前后改变两次对比,这里竟然没有改变前后都出发一次方法的选项,觉得不太好。我的实现方法是,一开始continuous属性设成YES,当你滑动的时候,很短的时间之后,slider就会出发响应时间,然后我们在响应时间里面再把continuous设为NO,这样之后就不会在触发,直到最后结束时刻才再触发一次:

<span style="font-size:18px;">-(void)adjustMusicProgress:(id)sender{
   //前面是处理代码,处理完后,给<span style="font-family: Arial, Helvetica, sans-serif;">continuous 属性取反就可以达到效果了。</span>
    _progressSlider.continuous = !_progressSlider.continuous;
  
}</span>

    个人觉得slider不断触发响应方法太浪费了,如果滑动过程中没有需要,可以使用上面方法,只留开始时和结束时触发两次就够了。

  如果只是单纯的需要第一次触发响应方法的时刻,可以考虑:

static bool isFirst = YES;
    if (isFirst) {
        isFirst = NO;
        //这里写需要在第一次处理的代码
    }
这个原理和构建单例对象时使用的相似,使用dispatch_once函数应该也可以。

  3、实现点击跳转:

    播放音乐或电影的进度条,在我们的使用习惯上都是可以通过点击进度条的某个位置,从而播放跳到相应的进度。UISlider很奇怪,除了UIControlEventValueChanged会响应事件,其他怎么点击都没有想过,遍历了下UISlider的subviews,发现userInteractionEnabled都为NO。最后给selider添加了一个点击收拾,发现效果挺好:

[self.progressSlider addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapSlider:)]];

通过点击的坐落点locaton的x和slider的宽度比较,能够大概得出点击位置的slider的value值,从而通过重设value使滑块跳转。

-(void)tapSlider:(id)sender{
    UITapGestureRecognizer * tapGR = (UITapGestureRecognizer *)sender;
    CGPoint location = [tapGR locationInView:tapGR.view];
    CGFloat value = location.x/_progressSlider.frame.size.width;
    [_progressSlider setValue:value animated:NO];
}

转载于:https://www.cnblogs.com/walkingZero/p/3920509.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值