自定义转换iOS(推送/弹出)
当按下新的viewController时,我创建了一个自定义的放大转换,它过去工作得非常好。现在我想在弹出viewController时创建一个缩小效果,即使最后的状态是正确的,动画也是错误的,因为我不知道如何识别它是在推还是弹出,所有的方法,如自定义转换iOS(推送/弹出),ios,objective-c,animation,uiviewcontroller,custom-transition,Ios,Objective C,Animation,Uiviewcontroller,Custom Transition,当按下新的viewController时,我创建了一个自定义的放大转换,它过去工作得非常好。现在我想在弹出viewController时创建一个缩小效果,即使最后的状态是正确的,动画也是错误的,因为我不知道如何识别它是在推还是弹出,所有的方法,如isBeingPresented返回false,而presentedViewController总是为零 -(void)animateTransition:(id<UIViewControllerContextTransitioning>)t
isBeingPresented
返回false,而presentedViewController
总是为零
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
self.transitionContext = transitionContext;
UIView *containerView = [transitionContext containerView];
UIViewController *fromViewController = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = (UIViewController *) [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
[containerView addSubview:toViewController.view];
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
scaleAnimation.duration = [self transitionDuration:transitionContext];
scaleAnimation.delegate = self;
scaleAnimation.removedOnCompletion = YES;
CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.duration = [self transitionDuration:transitionContext];
opacityAnimation.delegate = self;
opacityAnimation.removedOnCompletion = YES;
if (toViewController.isBeingPresented) {
scaleAnimation.fromValue = [NSNumber numberWithDouble:0];
scaleAnimation.toValue = [NSNumber numberWithDouble:1];
opacityAnimation.fromValue = [NSNumber numberWithFloat:1];
opacityAnimation.toValue = [NSNumber numberWithFloat:0];
} else {
scaleAnimation.fromValue = [NSNumber numberWithDouble:1];
scaleAnimation.toValue = [NSNumber numberWithDouble:0];
opacityAnimation.fromValue = [NSNumber numberWithFloat:0];
opacityAnimation.toValue = [NSNumber numberWithFloat:1];
}
[toViewController.view.layer addAnimation:scaleAnimation forKey:nil];
[fromViewController.view.layer addAnimation:opacityAnimation forKey:nil];
}
-(void)animateTransfion:(id)transitionContext
{
self.transitionContext=transitionContext;
UIView*containerView=[transitionContext containerView];
UIViewController*fromViewController=(UIViewController*)[transitionContext ViewControllerWorkey:UITransitionContextFromViewControllerKey];
UIViewController*toViewController=(UIViewController*)[transitionContext ViewControllerWorkey:UITransitionContextToViewControllerKey];
[containerView添加子视图:toViewController.view];
CABasicAnimation*scaleAnimation=[CABasicAnimation animationWithKeyPath:@“transform.scale”];
scaleAnimation.duration=[自转换持续时间:transitionContext];
scaleAnimation.delegate=self;
scaleAnimation.removedOnCompletion=是;
CABasicAnimation*opacityAnimation=[CABasicAnimation animationWithKeyPath:@“opacity”];
opacityAnimation.duration=[自转换持续时间:transitionContext];
opacityAnimation.delegate=self;
opacityAnimation.removedOnCompletion=是;
如果(显示的是视图控制器){
scaleAnimation.fromValue=[NSNumber numberWithDouble:0];
scaleAnimation.toValue=[NSNumber numberWithDouble:1];
opacityAnimation.fromValue=[NSNumber numberWithFloat:1];
opacityAnimation.toValue=[NSNumber numberWithFloat:0];
}否则{
scaleAnimation.fromValue=[NSNumber numberWithDouble:1];
scaleAnimation.toValue=[NSNumber numberWithDouble:0];
opacityAnimation.fromValue=[NSNumber numberWithFloat:0];
opacityAnimation.toValue=[NSNumber numberWithFloat:1];
}
[toViewController.view.layer addAnimation:scaleAnimation-forKey:nil];
[fromViewController.view.layer addAnimation:opacityAnimation-forKey:nil];
}
您可以保存UINavigationControllerOperation
变量:
-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController*)fromVC
toViewController:(UIViewController*)toVC {
self.navigationOperation = operation;
return self;
}
这与上面的代码没有关联,但这将覆盖navigationController的默认动画
//.h
@interface YJKit_Navigation : UINavigationController
+ (void)navigation:(UINavigationController *)navigationController withViewController:(UIViewController *)viewController push:(BOOL)isPush;
@end
//.m
@implementation YJKit_Navigation
+ (void)navigation:(UINavigationController *)navigationController withViewController:(UIViewController *)viewController push:(BOOL)isPush
{
[navigationController.view.layer addAnimation: isPush ? PushAnimation : PopAnimation forKey:nil];
isPush ? [navigationController pushViewController:viewController animated:NO] : [navigationController popViewControllerAnimated:NO];
}
@end
并且像这样使用它:
[YJKit_Navigation navigation:YourUINavigationController withViewController:YourTargetUIViewController push:(BOOL)];
希望这也能对您有所帮助:) 请参见我的带有pop动画的推送viewController变体
- (void)navigationController:(UINavigationController *)navigationController
present:(UIViewController *)viewController
animated:(BOOL)animated
completion:(void (^)(BOOL finished))completion {
self.completion = completion;
if (animated) {
CATransition *animation = [CATransition animation];
[animation setDelegate:self];
[animation setType:kCATransitionMoveIn];
[animation setSubtype:kCATransitionFromTop];
[animation setDuration:kPresentAnimationDuration];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[navigationController.view.layer addAnimation:animation forKey:kCATransition];
}
[navigationController pushViewController:viewController animated:NO];
if (!animated) {
self.completion(YES);
}
}
- (void)navigationController:(UINavigationController *)navigationController
present:(UIViewController *)viewController
animated:(BOOL)animated
completion:(void (^)(BOOL finished))completion {
self.completion = completion;
if (animated) {
CATransition *animation = [CATransition animation];
[animation setDelegate:self];
[animation setType:kCATransitionMoveIn];
[animation setSubtype:kCATransitionFromTop];
[animation setDuration:kPresentAnimationDuration];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[navigationController.view.layer addAnimation:animation forKey:kCATransition];
}
[navigationController pushViewController:viewController animated:NO];
if (!animated) {
self.completion(YES);
}
}