2010-10-28 89 views
2

我想創建一個UINavigationController的類別,所以我可以放在一起的幾個自定義動畫。我遇到了this question,它讓我開始了。我想出了一個推動作用如下:iPhone - UINavigationController - 自定義動畫與CATransaction

- (void)pushViewControllerMoveInFromBottom:(UIViewController *)viewController { 
    [CATransaction begin]; 
    CATransition *transition; 
    transition = [CATransition animation]; 
    transition.type = kCATransitionMoveIn; 
    transition.subtype = kCATransitionFromBottom; 
    transition.duration = 0.7; 

    [CATransaction setValue:(id)kCFBooleanTrue 
        forKey:kCATransactionDisableActions]; 

    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil]; 
    [self pushViewController:viewController animated:YES]; 
    [CATransaction commit]; 
} 

我不明白這視圖/正在通過電話子視圖訪問層。所以如果有人能幫助我理解,那會很有幫助。這似乎正在影響任何觀點即將登上熒幕。

我的主要問題是,我試圖創建一個流行,將「撤消」上述功能。爲了清楚起見,可以說我有兩個視圖,A和B.A是第一個顯示在屏幕上的視圖。上面的功能將在B中移動而不會將A推出。很像一個模態的觀點。但是,下面的函數將B拉回B,而不是將B拉開並將A留在原地。

- (void)popViewControllerMoveInFromTop { 
    [CATransaction begin]; 
    CATransition *transition; 
    transition = [CATransition animation]; 
    transition.type = kCATransitionMoveIn; 
    transition.subtype = kCATransitionFromTop; 
    transition.duration = 0.7; 

    [CATransaction setValue:(id)kCFBooleanTrue 
        forKey:kCATransactionDisableActions]; 

    [[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil]; 
    [self popViewControllerAnimated:YES];  
    [CATransaction commit]; 
} 

我不想使用模式視圖,我寧願不使用自定義動畫塊來更改視圖的框架。

回答

3

我已經完成類似的東西,但我沒有刻意將其移動到它自己的功能:

CATransition *transition = [CATransition animation]; 
transition.duration = 0.5; 
transition.type = kCATransitionMoveIn; 
transition.subtype = kCATransitionFromBottom; 
[self.navigationController.view.layer addAnimation:transition forKey:nil]; 

[self.navigationController popViewControllerAnimated:NO] 

你可以抽象出來。使用你的代碼,它看起來像:

- (void)popViewControllerMoveInFromTop { 
[CATransaction begin]; 
CATransition *transition; 
transition = [CATransition animation]; 
transition.type = kCATransitionMoveIn; 
transition.subtype = kCATransitionFromTop; 
transition.duration = 0.7; 

[CATransaction setValue:(id)kCFBooleanTrue 
       forKey:kCATransactionDisableActions]; 

[self.view.layer addAnimation:transition forKey:nil]; 
[self popViewControllerAnimated:NO];  
[CATransaction commit]; 
} 

你也可以創建一個使用的UIView的動畫對彈出一個自定義的過渡。在這裏,您正在將動畫應用到即將消失的視圖,然後將其從視圖堆棧彈出:

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.75]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.navigationController.view cache:NO]; 

[self.navigationController popViewControllerAnimated:NO]; 

[UIView commitAnimations]; 
相關問題