iOS自定义转场动画无法用presentingViewControll(fromView)中的view问题
问题描述
- 最近自己实现一个淘宝购物车动画效果(控制器A modal 一个控制器B,A的控制器view后移并实现一个动画效果,b控制器展现一部分),发现无法改变控制器A的view
效果图
————>
动画播放器中Animator中主要代码如下(ps:modalPresentationStyle为custom)
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{ static int flag = 0; //flag 确定是点击购物车,还是返回 flag++; UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; UIView *destinationView = [transitionContext viewForKey:UITransitionContextToViewKey]; if (flag % 2) { //动画效果处理 [[transitionContext containerView] addSubview:destinationView]; CATransform3D transform = CATransform3DIdentity; transform.m34 = -0.001; transform = CATransform3DRotate(transform, M_PI_4 * .2, 1, 0, 0); transform = CATransform3DTranslate(transform, 0, 0, -100); [UIView animateWithDuration:[self transitionDuration:nil] * 0.5 animations:^{ fromView.layer.transform = transform; } completion:^(BOOL finished) { [UIView animateWithDuration:[self transitionDuration:nil] * 0.5 animations:^{ fromView.layer.transform = CATransform3DMakeScale(.9, .9, 1); } completion:nil]; }]; destinationView.frame = [UIScreen mainScreen].bounds; destinationView.transform = CGAffineTransformTranslate(destinationView.transform, 0, kScreenBounsSize.height - 400); [UIView animateWithDuration:[self transitionDuration:nil] animations:^{ destinationView.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; }else{ [UIView animateWithDuration:[self transitionDuration:nil] animations:^{ fromView.transform = CGAffineTransformTranslate(fromView.transform, 0, kScreenBounsSize.height - 400); destinationView.layer.transform = CATransform3DIdentity; } completion:^(BOOL finished) { [transitionContext completeTransition:YES]; }]; } }
解决办法
- 将
fromView和destinationView直接从控制器调用 即将
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey]; UIView *destinationView = [transitionContext viewForKey:UITransitionContextToViewKey];改为
UIView *fromView = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey].view; UIView *destinationView = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey].view;
原因
我们将代码改为
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];和UIView *destinationView = [transitionContext viewForKey:UITransitionContextToViewKey];打印发现fromView出现了null:2017-02-22 11:33:49.254 taobaoEffect[1376:323552] fromView ----- (null) 2017-02-22 11:33:49.255 taobaoEffect[1376:323552] destinationView ----- <UIView: 0x7fb433c03690; frame = (0 0; 414 736); autoresize = W+H; gestureRecognizers = <NSArray: 0x60000005e540>; layer = <CALayer: 0x60000002e0c0>>
这里似乎没有任何问题,看文档也没有任何解释。但这又是一个Apple的一个坑,这在默认的文档下是没有的,但如果你下载文档了以后再看,你会发现在
viewForKey:方法中会有这么解释(Apple提醒你文档的重要性again) viewForKey: may return nil which would indicate that the animator should not manipulate the associated view controller’s view. 当viewController的view不该被animator所操作时,将返回nil// Currently only two keys are defined by the system - // UITransitionContextFromViewKey, and UITransitionContextToViewKey // viewForKey: may return nil which would indicate that the animator should not // manipulate the associated view controller's view. - (nullable __kindof UIView *)viewForKey:(UITransitionContextViewKey)key NS_AVAILABLE_IOS(8_0);
具体代码
https://github.com/NewYorkFive/taobaoShopListAnimator_Demo/tree/master
1343



被折叠的 条评论
为什么被折叠?



