2011-09-13 4 views
0

UIPageControl의 인스턴스를 즉시 나타나게하려면 어떻게해야합니까? (defersCurrentPageDisplayNO으로 설정했습니다.)UIPageControl 및 표시 지연

내보기가 나타날 때 UIPageControl 인스턴스가 구성되어 있습니다 (페이지 수, 현재 페이지 수, 업데이트 된 페이지 수). 그러나 사용자에게 나타나기 전에 짧은 고정 지연이 있습니다. 지금 당장 나타나고 싶습니다.

그렇지 않으면 정상적으로 작동합니다.

+1

당신은'viewWillAppear' 또는'viewDidAppear'에서 설정하고 있습니까? –

+0

둘 다 시도했지만 문제가 여전히 있습니다. 나는 페이지 컨트롤이 즉시 나타나기로되어 있다고 가정한다. (이전에이 객체를 사용하지 않았습니다.) – SK9

답변

2

문제는 오래 걸리는 백그라운드 프로세스를 수행하고 있으며 부수적으로 궁극적으로 updateCurrentPageDisplay 등을이 보조 스레드에서 호출했습니다. UIKit은 스레드로부터 안전하지 않으며 주 스레드로 이동할 수있을 때까지이 호출을 차단하므로 지연이 발생합니다.

이 문제를 해결하기 위해 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]; 
    } 
} 

을 다음 : 나는 UIPageViewController의 대리인의 willTransitionToViewControllers를 추가하고 거기 pageController의 인덱스를 설정하여 지연 문제를 해결 한

- (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

: 예를 들어

완료되지 않은 경우 다음 대리자 메서드를 추가하십시오.

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

}

관련 문제