iOS中如何使定時器不受UIScrollView滑動所影響

以下是使用 scheduledTimerWithTimeInterval 方法來實現定時器

- (void)addTimer
{
NSTimer scheduledTimerWithTimeInterval:2.0 repeats:YES block:^{
[self nextImage];
}
}

該方法會自動爲我們實例化的timer添加到當前線程的RunLoop中,並且默認模式是 NSDefaultRunLoopMode。但當前線程是主線程時,當scrollView或其子類進行滾動的時候,UIKIT會自動將當前runLoopMode切換爲UITrackingRunLoopMode,因爲runLoop只能在各種Mode之間切換,同一時間只能存在一個Mode,所以你加在NSDefaultRunLoopMode中的計時器當然不會走了。





因此,爲了設置一個不被UI干擾的Timer,我們需要手動創建一個Timer,再獲取到當前線程的Runloop,然後使用RunLoop的 addTimer:forMode: 方法來把Timer按照指定的模式加入到RunLoop中。

- (void)addTimer
{
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
// 消息循環
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSRunLoopCommonModes];
}

當加入到commonModes中時,實際上系統是找出commonModes代表的所有Mode,如NSDefaultRunLoopModeUITrackingRunLoopMode,讓後分別將其加入了這些mode中。

發佈了17 篇原創文章 · 獲贊 3 · 訪問量 9959
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章