無限輪播器的bug修復

前言:上一回實現了輪播器的自動滾動,可是有兩個須要處理的bug.ios

      1.增長需求:當用手拖拽控制輪播器的時候,中止自動滾動.多線程

  2.當同一個頁面中有tableView,textView或scrollview時,拖拽這些控件時:輪播器會中止自動輪播,卡住;當鬆開這些控件時:輪播器先快速輪播,把卡住的時間補回來,再恢復正常.oop

  緣由:界面的控件都是主線程建立的,和用戶的操做也都是在主線程中處理的. 當用戶拖拽另外的控件時,主線程就忙着處理這些拖拽行爲,就不能同時處理輪播器的滾動事件了.spa

 

解決問題1:線程

  1>.當多出用到一樣的代碼時,提取成一個方法:本demo中有兩處: 添加定時器,移除定時器 代理

// 添加定時器
- (void)addTimer
{
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];

    // 解決拖動其餘控件的時候,圖片輪播器不能響應的問題
    // 獲取當前主線程的消息循環,把self.timer加到主運行循環中.NSRunLoopCommonModes能夠同時處理多個事件.
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

// 移除定時器
- (void)removeTimer
{
    [self.timer invalidate];
    // 因此清空self.timer
    self.timer = nil;
}

  2>使用代理方法解決問題1. 立即將拖拽時,移除定時器. 完成拖拽是啓動定時器.code

#pragma mark - 代理方法
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    // 1.中止定時器,定時器一旦中止,就不能重用了
    [self removeTimer];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    // 啓動定時器
    [self addTimer];
}

 

解決問題2:blog

  方法1>多線程處理.這裏不行. 在ios中處理UI界面的事件,只能在主線程中執行,不能用其餘的線程來處理.若是多個線程來處理UI界面.極可能形成混亂衝突.例如UI顯示一份數據.要保證同一時間,只有一我的能夠修改這份數據. 若是多線程的話就能夠有多我的同一時間進行操做.就會衝突.事件

  方法2>提升Scrollview拖拽事件的優先級,就是讓主線程同時處理這兩個事件.圖片

[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];// 獲取當前主線程的消息循環,把self.timer加到主運行循環中.NSRunLoopCommonModes能夠同時處理多個事件.
相關文章
相關標籤/搜索