如何立即显示UIPageControl
的实例? (我已将defersCurrentPageDisplay
设置为NO
。)
我有一个UIPageControl
的实例,当我的视图出现时,该实例已配置(页数,当前页面然后更新)。然而,在用户看来之前存在短暂的固定延迟。我希望它立即出现。
否则它工作正常。
答案 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];
}
}
}
}