答案 0 :(得分:6)
我做了类似于你描述的事情,即在UINavigationController中更改pop和push of view的默认动画。
我们的想法是禁用对象的默认动画并将其替换为您自己的动画。我为UINavigationController创建了一个新类别,并使用了类似下面的函数。
- (void) altAnimatePopViewControllerAnimated:(BOOL)animated
{
[CATransaction begin];
CATransition *transition;
transition = [CATransition animation];
transition.type = kCATransitionPush; // Use any animation type and subtype you like
transition.subtype = kCATransitionFromTop;
transition.duration = 0.3;
CATransition *fadeTrans = [CATransition animation];
fadeTrans.type = kCATransitionFade;
fadeTrans.duration = 0.3;
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[[[[self.view subviews] objectAtIndex:0] layer] addAnimation:transition forKey:nil];
[[[[self.view subviews] objectAtIndex:1] layer] addAnimation:fadeTrans forKey:nil];
[self popViewControllerAnimated:YES];
[CATransaction commit];
}
使用代码
[self.navigationController altAnimatePopViewControllerAnimated:YES];
为了进行推送,只需创建另一个类似的功能并反转动画。
它不完美但它有效。当您选择不同的动画类型时,可以使用组成导航栏/控制器的不同子视图来完善它。
拿出我的白色来提出这个,所以明智地使用它:)
*******编辑
尝试用此替换推送转换(我自己没试过):
CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
scale.duration = duration;
scale.values = [NSArray arrayWithObjects:[NSNumber numberWithFloat:.5f],
[NSNumber numberWithFloat:1.2f],
[NSNumber numberWithFloat:.85f],
[NSNumber numberWithFloat:1.f],
nil];
这会弹出,即视图在大小合适之前会更大。使用数组中的值来控制动画的曲线。