这个动画。  感谢大神分享

JPPopPresentAnimation.gif

要实现这个功能分两步走:第一步,先实现这个动画。第二步,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行代码集成到项目

为什么要强调0行代码集成到项目?

  • 刚开始写代码的时候,项目老大并没有说要这个动画,你项目都快结束了,他说这个动画挺好,我们也做一个吧(程序员转过身:XXX脏话)。这个时候你已经写了几百个Model动画的代码了,你不可能一个一个去找去改吧?
  • 几百行你改完了,你以为终于完事了,这件事就过去了,结果产品经理一个月以后又跑过来说,这个功能我们还是砍掉吧。(程序员大声:XXXXXX很脏的话)。

所以,这个时候低耦合易集成就显得特别重要。

为了处理这样的需求,所以采用hook方案,结合runtime来解决。hook就是钩子的意思。

  • 我们要用这个钩子把系统所有的Model动画的实现都钩出来,然后再把我们自己写的pop动画也给钩出来。
  • 然后再运用动态方法交换,将这系统的Model动画和自己的pop动画的实现相互替换。
  • 所以以后,我们再调用系统的Model动画的时候,实际上会去方法实现里找我们自己的pop动画去执行。这也就是为什么可以0行代码集成这个功能的原因。
  • 也有可能我们在某些情况下不需要pop动画,比如说照片浏览器。这种情况很少,所以你只需要写很少的代码,去调用我们自己的pop动画。当调用我们自己的pop动画的时候,我们的钩子会去找系统的Model动画去执行。

思路就到这里了,具体的实现细节,还需要您自己去Github下载 demo

文/NewPan(简书作者)
原文链接:http://www.jianshu.com/p/910d7825f06a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

集成Facebook和Twitter的Model动画-b的更多相关文章

  1. 网站如何集成Facebook和Twitter第三方登录

    最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...

  2. Android Facebook和Twitter登录和分享完整版

    最近公司的软件需要改国际版,需要Facebook和Twitter的登录和分享. 本人先用Umeng的第三方社会化分享实现了该功能,但是后来一想问题来了,经过查证.Umeng只在中国和美国有服务器,那也 ...

  3. Android Facebook和Twitter分享

    1. 背景 在年初的时候,公司的项目有个新的需求,在英文版的应用中加入Facebook和Twitter分享功能. 2. 完成情况 由于这个项目比较急,所以开发这个功能从预研到接入总共耗时一周.后来,在 ...

  4. 使用facebook和twitter进行分享经验总结

    凤凰涅槃,浴火重生. 在传说当中,凤凰是人世间幸福的使者,每五百年,它就要背负着积累于在人间的所有痛苦和恩怨情仇,投身于熊熊烈火中自焚,以生命和美丽的终结换取人世的祥和与幸福.同样在肉体经受了巨大的痛 ...

  5. 利用本地HTTPS模拟环境为FastAPI框架集成FaceBook社交三方登录

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_174 提起社交,就不得不说马克·扎克伯格(Mark Zuckerberg)一手创办的社交网络(FaceBook).进入2020年, ...

  6. 分享前端Facebook及Twitter第三方登录

    最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...

  7. 移动端折腾国外分享(facebook、twitter、linkedin)

    一.前言 国内做HTML5页面,关注最多就是微信分享了,之前也写过关于微信分享的文章,可以点击查看:分享相关文章 再者,就是国内的其它分享,比如常用的新浪微博.腾讯微博.QQ空间等等,最方便的就是直接 ...

  8. 为什么中国出不了facebook和Twitter?

    我们坐拥全球最大基数的网民,我们拥有让人骄傲的四大发明,我们有有流传全世界的孙子兵法,可是在互联网时代,我们却落后了.互联网可以说是江山人才辈辈出,各领风骚三两年. 让我们来简单地回顾一下近几年的互联 ...

  9. web网页动态分享facebook和twitter

    介绍 facebook分享 http://www.facebook.com/sharer.php?t=${text}u=encodeURIComponent('静态html') twitter分享 h ...

随机推荐

  1. c#的方法重写和的java方法重写有什么区别

    java code: package example; class m1 { public int getInt() { return 0; } } class m2 extends m1 { pub ...

  2. Java开发十大常用网站

    Stackoverflow:有成千上万个好问题和答案 DZone:有相当多的开发者在这个网站上分享他们博客文章 LeetCode:如果有Java方面的面试问题可在教程中找到答案 Java SE技术文档 ...

  3. java.util.Stack类简介

    Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用 ...

  4. ecshop在PHP 5.4以上版本各种错误问题处理

    在php5.4版本之后有很多的函数与功能进行丢弃与升级功能了,现在国内很多CMS都还未按php5.4标准来做了,下面我整理了一些在ecshop在PHP 5.4以上版本各种错误问题处理. 1.PHP 5 ...

  5. js事件模型

    连接在此 http://www.cnblogs.com/zqstc/archive/2009/11/26/1611464.html

  6. export命令和import命令 详解

    export命令 模块功能主要由两个命令构成:export和import. export命令用于用户自定义模块,规定对外接口: import命令用于输入其他模块提供的功能,同时创造命名空间(names ...

  7. js 获取当前时间格式怎么转换?

    toLocaleDateString() 得到的时间是 yyyy年MM月dd日 HH:ss:mm 格式的,怎么转换成yyyy-MM-dd HH:ss:mm 在js里面 仅针对这个问题来说,不需要那么大 ...

  8. Servlet相关接口和Servlet的生命周期

    http://www.cnblogs.com/luotaoyeah/p/3860292.html Servlet相关接口和Servlet的生命周期 创建一个Servlet类最直接的方式是实现javax ...

  9. Android colors.xml

    <?xml version="1.0" encoding="utf-8"?><resources> <color name=&qu ...

  10. php导出execl

    <?php function export_excel($items,$fields,$fields_array,$name) { /* * 调用方法示例 * $items = $this-&g ...