2012-01-30 4 views
5

UIViewController가 사라지게하기 전에 애니메이션을 사용하여 탐색 모음을 숨기려고합니다.viewDidDisAppear에서 애니메이션이 끝날 때까지 기다리는 방법?

-(void) viewWillDisappear:(BOOL) animated { 
    [UIView transitionWithView:self.view 
         duration:UINavigationControllerHideShowBarDuration 
         options:UIViewAnimationCurveEaseOut 
        animations:^{ 
     [self.navigationController setNavigationBarHidden:YES];  
    } 
        completion:^(BOOL finished){ 
        NSLog(@"animation finished"); 
    }]; 

    [super viewWillDisappear:animated]; 
} 

문제는 viewWillDisappear 실행 그냥 돌아가 전체보기 애니메이션 완료하기 전에 멀리 갈 것입니다 계속 것입니다 : 그러므로 나는 다음과 같은 구현했습니다. 애니메이션이 완료되기 전에 메소드가 반환되지 않게하려면 어떻게해야합니까? ("애니메이션 마침"이 인쇄되는 곳).

+0

애니메이션을 만들 수 없습니다. 어쩌면 당신은'setNavigationBarHidden : animated :'메소드를 대신 찾고있을 것인가? –

+0

'setNavigationBarHidden : animated :'를 사용하고 싶지 않습니다. iOS 4 (왼쪽으로 슬라이드)와 iOS 5 (위쪽으로 슬라이드)에서 다르게 애니메이션을 적용하기 때문입니다. 아무튼, 'viewNillDisappear' 블록 내에'setNavigationBarHidden : animated :'를 넣는 것은 여전히 ​​애니메이션이 끝나기 전에 메소드가 돌아 오기 때문에 중요하지 않습니다. 아마도 여기에 두 개의 스레드가 필요하다고 생각합니까? –

답변

2

viewWillDisappear:animated은 본질적으로 호의 통지입니다. 그것은 단지 그것이 일어나기 전에 임박한 것이 무엇인지 말해줍니다. 실제로보기가 사라지거나 지연 될 수 없습니다.

가장 좋은 솔루션은 (안된)와 같은 방법을 만듭니다 UINavigationController에 카테고리를 생성하는 것입니다 :

- (void)pushViewControllerAfterAnimation:(UIViewController *)viewController animated:(BOOL)animated { 
    [UIView transitionWithView:viewController.view 
         duration:UINavigationControllerHideShowBarDuration 
         options:UIViewAnimationCurveEaseOut 
        animations:^{ 
         [self.navigationController setNavigationBarHidden:NO];  
        } 
        completion:^(BOOL finished){ 
         NSLog(@"animation finished"); 
         [self pushViewController:viewController animated:animated]; 
        }]; 
} 

- (void)popViewControllerAfterAnimationAnimated:(BOOL)animated { 
    [UIView transitionWithView:self.visibleViewController.view 
         duration:UINavigationControllerHideShowBarDuration 
         options:UIViewAnimationCurveEaseOut 
        animations:^{ 
         [self.navigationController setNavigationBarHidden:YES];  
        } 
        completion:^(BOOL finished){ 
         NSLog(@"animation finished"); 
         [self popViewControllerAnimated:animated]; 
        }]; 
} 

그런 다음 대신

- (void)pushViewControllerAfterAnimation:(UIViewController *)viewController animated:(BOOL)animated

에이 부를 수

- (void)popViewControllerAfterAnimationAnimated:(BOOL)animated

입니다.

+0

멋지다 :), 비록 내가 transitionWithView를 사용할 때 어떤 일이 일어날 지 모르겠지만 : curveEaseInOut 옵션을 사용하면 결코 그렇게 해본 적이 없다. –

+0

나는 동의한다, 나는 완전히 확실하지 않다. transitionWithView의 사용 : OP의 원래 코드에서 비롯되었지만 테스트하지 않았습니다. –

관련 문제