标签:
这个动画。 感谢大神分享
要实现这个功能分两步走:第一步,先实现这个动画。第二步,0行代码集成到项目。也就是,你不用改原有项目的任何代码,只要把写好的动画代码拖进项目,以后所有的Model就拥有这个动画了。
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion
好,准备好了吗?现在开始。
首先我们来分析一下这个动画,这个动画就是在Model的时候拿到当前控制器的View,然后在Model的过程中将这个View的尺寸缩小。然后在Dismiss的时候拿到这个View,将它尺寸恢复成原有的大小。就这么多了。
怎么在model动画中拿到当前的控制器的View?这个很简单,只要你设置动画样式为自定义,并且成为弹出动画的代理,就像这样:
self.modalTransitionStyle = UIModalPresentationCustom;
viewControllerToPresent.transitioningDelegate = self;
然后在代理方法中,会询问转场动画的提供者,此时,你再去新建一个JPTransitionManager作为转场动画的提供者。
// 询问转场动画的提供者
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed;
在这个转场动画的提供者里,我们继承NSObject,然后遵守
UIViewControllerAnimatedTransitioning协议,然后实现协议中这两个方法:
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
第一个方法是询问动画的时长的。第二个方法中我们可以拿到准备做Model动画的上下文transitionContext,在上下文中我们就可以通过:UITransitionContextFromViewControllerKey和UITransitionContextToViewControllerKey两个key拿到当前的控制器和即将弹出的控制器。
控制器都拿到了,我们就可以拿到控制器对应的View进行动画了。
为什么要强调0行代码集成到项目?
所以,这个时候低耦合易集成就显得特别重要。
为了处理这样的需求,所以采用hook方案,结合runtime来解决。hook就是钩子的意思。
思路就到这里了,具体的实现细节,还需要您自己去Github下载 demo 。
标签:
原文地址:http://www.cnblogs.com/isItOk/p/5738765.html