首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIPageControl和出现延迟

UIPageControl和出现延迟
EN

Stack Overflow用户
提问于 2011-09-13 09:33:27
回答 2查看 731关注 0票数 0

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

我有一个UIPageControl实例,它是在我的视图出现时配置的(页数、当前页面,然后更新)。然而,在它出现在用户面前之前,有一个短的、固定的延迟。我想让它马上出现。

除此之外,它工作得很好。

EN

回答 2

Stack Overflow用户

发布于 2011-09-13 13:17:10

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

为了解决这个问题,我创建了UIPageControl的子类,创建了“包装器”方法,将对super的调用推送到主线程上。然后,每当我需要与我的页面控件对话时,我就可以安全地忘记这一点。

例如:

代码语言:javascript
复制
- (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];
    }
  }
}
票数 2
EN

Stack Overflow用户

发布于 2015-01-08 18:45:53

我已经修复了延迟问题,添加了UIPageViewController委托的willTransitionToViewControllers并在那里设置了pageController的索引:

代码语言:javascript
复制
- (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];
    }
}

然后,为了避免在未完成卷帘的情况下出现错误,请添加以下委托方法:

代码语言:javascript
复制
- (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];
        }
    }
}

}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7395872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档