2010-10-28 95 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]; 
相关问题