UIPageControl和延迟出现

时间:2011-09-13 01:33:27

标签: iphone ios uipagecontrol

如何立即显示UIPageControl的实例? (我已将defersCurrentPageDisplay设置为NO。)

我有一个UIPageControl的实例,当我的视图出现时,该实例已配置(页数,当前页面然后更新)。然而,在用户看来之前存在短暂的固定延迟。我希望它立即出现。

否则它工作正常。

2 个答案:

答案 0 :(得分:2)

问题是我正在执行一个漫长的后台进程,我无意中最终从这个辅助线程调用updateCurrentPageDisplay等。 UIKit不是线程安全的,并阻止此调用,直到它可以将其移动到主线程,因此延迟。

为了解决这个问题,我已经创建了UIPageControl子类创建“包装器”方法,将方法调用super到主线程上。每次我需要使用页面控件时,我都可以安全地忘记这一点。

例如:

- (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 :(得分:1)

我通过添加UIPageViewController委托的willTransitionToViewControllers并在那里设置pageController的索引来解决延迟问题:

- (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)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];
        }
    }
}

}