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];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章