2011-09-13 46 views
0

如何使UIPageControl的實例立即出現? (我已將defersCurrentPageDisplay設置爲NO。)UIPageControl和延遲出現

我有一個UIPageControl的實例,當我的視圖出現時配置(頁數,當前頁面,然後更新)。但是,在用戶看來有一個短暫的固定延遲。我希望它馬上出現。

否則它工作正常。

+1

你是在'viewWillAppear'還是'viewDidAppear'中配置它? –

+0

我已經嘗試了兩種方法,但仍然存在問題。我假設頁面控件應該立即顯示? (我以前沒有使用過這個對象。) – SK9

回答

2

問題是我正在執行一個冗長的後臺進程,並且我無意中最終會從這個輔助線程中調用updateCurrentPageDisplay等。 UIKit不是線程安全的,並阻止該調用,直到它可以將它移動到主線程,因此延遲。

爲了解決這個問題,我已經將UIPageControl分類爲UIPageControl,創建了一個將調用推送到super到主線程上的「包裝器」方法。每當我需要使用頁面控件時,我都可以放心地忘記這一點。

例如:

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { 
for (MyContentPageViewController *contentController in pendingViewControllers) { 
    if ([contentController isKindOfClass:[MyContentPageViewController class]]) { 
     NSUInteger newIndex = contentController.pageIndex; 
     [self.pageControl setCurrentPage:newIndex]; 
    } 
} 

然後,爲了避免在案件的錯誤,其中刷卡是:

- (void) updateCurrentPageDisplay 
{ 
    @synchronized(self) 
    { 
    if ([UIDevice currentDeviceSupportsGrandCentralDispatch] == YES) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     [super updateCurrentPageDisplay]; 
     }); 
    } 
    else 
    { 
     [super performSelectorOnMainThread:@selector(updateCurrentPageDisplay) 
           withObject:nil 
          waitUntilDone:NO]; 
    } 
    } 
} 
1

我已經加入UIPageViewController委託的willTransitionToViewControllers和設置的PageController的指數有固定的延遲問題未完成,請添加以下代理方法:

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{ 
if(finished){ 
    for (MyContentPageViewController *contentController in previousViewControllers) { 
     if ([contentController isKindOfClass:[MyContentPageViewController class]]) { 
      NSUInteger currentIndex = MIN(MAX(0, contentController.pageIndex), _allPages.count- 1); 
      [self.pageControl setCurrentPage:currentIndex]; 
     } 
    } 
} else { 
    for (MyContentPageViewController *contentController in previousViewControllers) { 
     if ([contentController isKindOfClass:[MyContentPageViewController class]]) { 
      NSUInteger currentIndex = MIN(MAX(0, contentController.pageIndex), _allPages.count); 
      [self.pageControl setCurrentPage:currentIndex]; 
     } 
    } 
} 

}