起名​假若没有QQ,今日的社交之王不是微信,而是米聊!

四月9日,微信发表最新用户数据:日跃用户达9.02亿,成为海内外下载量最大和用户最多的通信软件,毫无疑问,微信成为无可取代的应酬之王!

前言

苹果在IOS7过后给导航控制器增添了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的指头运动,当用户放手后,系统会咬定手指拖动出来的分寸来决定是否要实施控制器的Pop操作。

nav_pop_origin.gif

这么些操作的想法非常好,可是系统给大家规定的限制必须是屏幕右边边缘才方可触发,这样其实使用过程中对于有些产品会生出不便,于是有些app就应用任何屏幕都响应这一个手势并且pop动画仍然用系统原生的,这样操作起来实在方便广大。

nav_pop_custom.gif

起始大家一定会有疑难,给控制器的View加个手势然后拖动控制器的View时改变它的frame不就足以了呢?没错,加手势这么些想法是无可非议的。可是,由我们自己来改变控制器视图的职务是相比较麻烦的,细心的恋人肯定发现了,我们自定义pop手势下边的导航栏也是在随着你的手势拖拽而改变的,所以这样做还索要负担导航栏的卡通片,而且有一个着重问题,假诺单独拖动view,这些view下边会是黑黑的一片,因为控制器的push和pop层级是由系统管理的。

nav_pop_failed.gif

因而走这条路尽管能够,但落实起来会相比劳碌。那么,怎么样促成这么些效果呢?前几天就给我们提供两套实现方案。


[\[1\]](https://www.jianshu.com/p/d39f7d22db6c#fn1)

依傍微信、QQ、游戏三大系列,腾讯的清前几天复一日,市值突破5000亿日元,牛到富可敌省,直逼海南上上下下GDP!

方案一:自定义UIViewControllerInteractiveTransitioning对象,实现导航控制器代理方法。

以此是苹果官方推荐的做法,在WWDC 2013 218 – Custom Transitions Using
View
Controllers
中有表达。

这套方案即使实现相比麻烦,不过动画相对灵活,你可以兑现如此的效用,

nav_pop_cube.gif

也可以有这种效率。

nav_pop_flip.gif

事实上那么些拖动过程属于导航控制器的动画片,所以我们需要重写UINavigationController的五个代理方法,navigationController:animationControllerForOperation:fromViewController:toViewController:(名字很长上面就称为方法1)和
navigationController:interactionControllerForAnimationController:(方法2)。
解释一下他们的功能,方法1是苹果提供给大家用来重写控制器之间转场动画的(pop或者push)。方法2您可以如此了解,苹果让我们再次来到一个交互的指标,用来实时管理控制器之间转场动画的完成度,通过它我们得以让控制器的转场动画与用户交互(注意一点,假若艺术1回来是nil,方法2是不会调用的,也就是说,唯有我们自定义的动画才足以与控制器交互)。

上边我们来看一下贯彻过程。为了有利于我们知晓,我会尽量在Demo中的注释写的最清晰明了。
同时,我们先用最简单易行的代码实现,在这篇小说的尾声我会对本例中的Demo提供一个相持合理的写法。

先是在章程1中,我们再次来到一个遵守了UIViewControllerAnimatedTransitioning协议的对象,它就是自定义的卡通对象,大家给它起名PopAnimation,在这么些类中贯彻五个办法来自定义转场动画。

屏幕快照 2015-03-28 下午6.49.05.png

再来看方法2,我们需要回到一个死守了UIViewControllerInteractiveTransitioning协议的目的(指示一下,这五个研究容易混淆视听,要小心区分,一个是承担动画,一个是承受交互过程),苹果已经有一个类专门处理这一个效果,它叫UIPercentDrivenInteractiveTransition,当然你也可以自定义一个这么的类。我们可以这么敞亮它的意义:前边在艺术1中回到的动画,会在举办的过程中被系统分解以用于用户交互,这么些互动过程的动画完成度就由它来调控。上边我们来看一下什么样使用它。(为了让控制器视图拖动,大家给控制器的视图加了一个拖出手势,在拖动方法里我们对这些目标举行操作)

屏幕快照 2015-03-29 上午12.33.59.png

末尾在视图控制器里重写导航栏的五个形式。

屏幕快照 2015-03-29 早上12.37.51.png

有两点并非遗忘:

  1. 设置导航控制器的代理为眼前控制器。
  2. 给控制器加手势。

OK,这样大家就水到渠成了这么些历程。

nav_pop_own.gif


[\[2\]](https://www.jianshu.com/p/d39f7d22db6c#fn2)

但悔过来看腾讯的头牌花魁“微信”,还真是险中打败的结果,即便这时未曾QQ,近来的相持之王可能就是雷军的“米聊”了。

方案二:Runtime+KVC

要了解这样的做法,需要有Runtime的一些学问,会涉及到村办变量、私有方法的拿走,可是如此做比较简单也相比有趣,假设你感兴趣就连续看下来啊。关于Runtime的知识,今后我会分享到博客里,朋友们敬请期待。

为了有利于我们阅读下边的代码,我们需要先精通系统的这个手势。

前方我们明白到,那么些手势属于UINavigationController,我们就跳到它的头文件里看望能无法找到线索。那些思路是没错的,确实有一个手势叫做interactivePopGestureRecognizer。属性为readonly,就是说我们不可能给她换成自定义的手势,然则足以设置enable=NO。ok,既然找到了它,就打印一下探访它究竟是一个什么样手势。

屏幕快照 2015-03-26 早上5.17.35.png

经过log,大家看来她属于UIScreenEdgePanGestureRecognizer这些类(往日自己是绝非用到过),它延续自UIPanGestureRecognizer,出现在IOS7未来,是特意处理在屏幕边缘触发的手势类型,并且只有一个特性叫edges,用来安装它的触发边缘(上、下、左、右、全体)。看到此间一些朋友会想,直接改它的edges为总体可不得以?经过试验精晓到,改那么些特性是没用的,它不得不用来触发边缘,设为全体的趣味是六个趋势的边缘会触发,而且用来做控制器POP手势的只有左侧缘。

咱俩后续看它的log。控制台除了打印了它的类,还打印了它的触发target:_UINavigationInteractiveTransition(这是一个私有类,看来是特地用来做导航控制器交互动画的),和action:handleNavigationTransition(这是它的一个个体方法),大家要做的就是新建一个UIPanGestureRecognizer,让它的接触和系统的那几个手势相同,这就需要利用runtime获取系统手势的target和action。

那么哪些取得这个target呢?一起始自我用kvc想从来拿走这个手势的target,程序崩溃了,原来它根本未曾那样一个特性。所以自己能想到的是,先选用runtime遍历它的兼具成员变量,看看系统是怎么存储这个特性的,

屏幕快照 2015-03-29 深夜3.25.02.png

经过log我们得以看来,UIGestureRecognizer有一个叫_targets的性能,它的品种为NSMutableArray。

屏幕快照 2015-03-29 中午3.25.09.png

它是用数组来储存每一个target-action,所以可以动态的增多手势触发对象。那么又是何许存储每一个target-action呢?为了精晓这一个大家得到这一个特性的名字”_targets”通过kvc获取它,接着打印出来。

屏幕快照 2015-03-29 早上3.33.54.png

屏幕快照 2015-03-29 下午3.34.01.png

可以看看,由于系统重写了它的description方法,所以大家没办法通过打印获取那几个目的是怎么项目。既然无法打印,那么我们就用断点调试,来看它的忠实类型,

屏幕快照 2015-03-29 早上3.37.32.png

大家来看,原来每一个target-action是用UIGestureRecognizerTarget这样一个类来存储的,它也是一个私有类。
苹果把许多的类做私有化也是有案由所在,其实在平日大家得到这多少个类也是没有用的,他们的目标之一是避免对开发者公开无用的类,影响了封装性。所以在类的规划上,依旧要向苹果学习。

下面直接看代码。

俺们在控制器的ViewDidLoad加上那段代码,并且它只需要实施一次。

屏幕快照 2015-03-29 上午4.07.48.png


米聊

优化

本条demo我会提供给我们,下边简单说下程序的优化思路。

  • 优化点一:对于方案一,其实不应当把导航控制器的代办方法以及手势处理的办法交给视图控制器,因为那段代码不是属于某一个视图控制器,而是全局的领航控制器,所以我们应当参照苹果的筹划思想:新建一个特别管理相互过程的目的,那一个类我们誉为NavigationInteractiveTransition。

  • 优化点二:再来看从前的ViewDidLoad中只进行三遍的代码,其实写在此处也不够妥当,同样的,这段代码也不属于某一个Controller,优化方案是新建一个导航控制器,在这个导航控制器的viewDidLoad中写上那么些代码,那样也并不需要dispatch
    once。

  • 优化点三:由于我们自定义的手势是加在一个私房view上,这个view是一个大局的,所以当以此控制器为根控制器时,我们的手势仍然在起效果,这就一定于对根控制器做了pop操作,这会冒出一个荒谬nested
    pop animation can result in corrupted navigation
    bar。导致那一个似是而非的因由还有一个,如若我们pop的动画正在举办,再去接触三次手势,会造成导航控制器和导航条的动画片混乱。为了防止问题应运而生大家需要变成手势的代办,判断当前控制器是否为根控制器并且pop或者push动画是否在实践(这么些变量是个人的,需要用kvc来赢得)。

屏幕快照 2015-03-30 下午5.06.24.png

通过最终的优化,视图控制器可以什么都不写,想行使这几个职能,只要使用我们自定义的导航控制器就足以了,这样的补益是手势动画与控制器完全解耦,并且毫不给每一个控制器都addGesture。


给我们推荐一个储藏室https://github.com/nst/iOS-Runtime-Headers,这些库房可以调取苹果的所有私有方法头文件,分外强大。

说到底放上这多少个demo的地点:https://github.com/zys456465111/CustomPopAnimation(使用时,切换工程的scheme就能切换不同方案。对于方案二,只需要导航控制器的类就足以了。)

谢谢我们,轻松学习系列还会继续下去,我会尽量写出更多通俗易懂的篇章,让开发变得轻松起来,我的博客园:http://weibo.com/JazysYu


  1. 方案一。

  2. 方案二。

二零一零年1月,境外起首流行一款移动社交软件kik,这让张小龙眼睛一亮,他还在察看中,雷军就先动手为强了。三星只用1个月就模仿出一款中华版kik,取名叫“米聊”。

唯其如此说,HTC的快慢简直是太快了,要精晓这年10月份,雷军才拉起杆子创造三星公司,一手研发手机,一手搞MIUI系统,不知道又腾出哪只手搞了个社交软件。

华为团队

及时的“米聊”也流行一时,很快覆盖了安卓、iOS和红米的塞班系统。然而雷军也很怕小马哥来闹事,他说:“假若腾讯出席这多少个圈子,这米聊成功的可能就会大大降低,插手得越早,我们中标的难度就越大。据内部消息,腾讯给了大家3个月的时辰。”

实际上,腾讯的立意程度远超出雷军的设想,张小龙紧随其后,指导13个人的集团熬夜70天开发出第一代腾讯版kik,即二〇一一年四月21日出产的“微信”。此后,“微信”和“米聊”起初了霸气竞争。

微信团队

雷军引导米聊团队夜以继日迭代产品、优化服务、宣传拓宽。后来因为接入对讲效用,米聊用户突然活跃,惊喜连连。张小龙也提升,开通了语音聊天功用,用户也应运而生井喷式增长。

微信的“摇一摇”、“漂流瓶”、“查看附近的人”才真正激发到用户,粉丝增长速度让开发公司都喜笑颜开。然则,这么些职能也给早期的微信贴上“约炮”的价签,有人想起:“当初很长一段时间,用微信的都给自身一种不正经的记念。”但就是这个功用,让微信积累了第一批忠实种子用户。

微信

探望希望未来,马化腾初阶利用QQ给微信导流。首先,微信可以不要登记,间接用QQ登录,其次还足以一键导入QQ好友,补助对象圈和QQ空间同步说说动态。

就这样,微信轻松复制了QQ6.5亿人的社交圈子,得到了从PC转型到活动端的一级VIP,这也是“米聊”输给微信的显要原因之一。

为了捧微信,QQ做出很大牺牲,几乎是自杀式的相对化协理,自身用户和活跃度受到很大影响,很三个人废弃了QQ,不再向往太阳等级,不再关心皮肤黄钻。但马化腾说,这是战略性需要,必须壮士断腕!

马化腾

之后,米聊就不再是微信的挑衅者了,直到2014年被迪拜市一家互联网集团收购,版本更新到2016年结束。而“米聊”的失利,跟那个名字也有关。

那几年,中兴手机刚先河急剧,很三个人以为“米聊”是小米手机专用,安卓党和苹果党压根没想过要用“米聊”社交,其实“米聊”版本覆盖了全部的智能手机市场,可见起名有多首要。

一家独大后,微信发展尤为高效,2019年活跃用户突破九亿,是天底下华人的画龙点睛应用,笔者前天跑去泰王国巡游,还加了几个泰国人的微信。

寄托社交,微信又陆续上线了公众号、微信支付、理财等效果,渐渐形成微信生态系统,成为众多商人、文字工作者、互联网商家依赖的阳台。

雷军和马化腾

雷军后来说,即使没有QQ,鹿死什么人手还不肯定呢。不得不说,QQ就是风传中“巨人的肩膀”,是腾讯连年的用户积累,如今活蹦乱跳用户高达8.5亿。没有QQ,微信或者也没那样容易得逞,有了QQ,腾讯产品想失利都难。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图