UIPageControl и задержка появления - PullRequest
       15

UIPageControl и задержка появления

0 голосов
/ 13 сентября 2011

Как сделать так, чтобы экземпляр UIPageControl появился сразу? (Я установил defersCurrentPageDisplay на NO.)

У меня есть экземпляр UIPageControl, который настраивается (количество страниц, текущая страница и затем обновляется), когда появляется мое представление. Однако существует небольшая фиксированная задержка, прежде чем она появится пользователю. Я бы хотел, чтобы это появилось сразу.

В остальном работает нормально.

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Проблема в том, что я выполняю длительный фоновый процесс, и я случайно и в конечном итоге назвал 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 голос
/ 08 января 2015

Я исправил проблему задержки, добавив willTransitionToViewControllers делегата UIPageViewController и установив там индекс 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];
        }
    }
}

}

...