内容简介:我们的在做动效中经常会有这样的需求,A动画执行完,执行B动画,B动画执行完执行C动画这样的序列,比如如下效果:iOS 10之前,我们可能这样实现这个动画序列,实际上可能你现在的代码就是这样写的:
我们的在做动效中经常会有这样的需求,A动画执行完,执行B动画,B动画执行完执行C动画这样的序列,比如如下效果:
iOS 10之前,我们可能这样实现这个动画序列,实际上可能你现在的代码就是这样写的:
UIView.animate()提供了一个完成block回调,我们可以用它来触发下一个动画。这样做,我们可以实现这个动画。正如你可以看到的,这坨代码的主要缺点是丑陋,几乎没有可读性。
UIViewPropertyAnimator
iOS10引入了UIViewPropertyAnimator ,基于篇幅原因,这里不对其做详细介绍,如果需要读者请自行补脑。我关心的是如何提高这类多层嵌套代码的可读性,通过UIViewPropertyAnimator,前面的代码片断将成为:
通过上面的方式我们可以将动画定义分离开来,这样不仅有更好的可读性,还可以解耦。这样已经比开始的代码漂亮多了,但是我们还可以写的更好...
Reactive animation chaining
我是一个rx的重度用户,我首先想到的是:是否有办法让UIViewPropertyAnimation与RxSwift兼容?
大概思路是观察一个动画的状态,然后触发下一个,接下来我们通过扩展UIViewPropertyAnimation来实现 扩展会有封装UIViewPropertyAnimator的“startAnimation”和“addCompletion”机制。它将返回的可观察的状态。但是为了简单起见,我们假定一个动画只能“complete”,没有“stream”管理(如onNext、onSubscribed onDisposed等等)。
Talk is cheap,Show me the code
上面动画扩展返回一个 Completable状态 ,订阅时,将开始动画和添加完成回调,发送一个“.completed”事件。目的很简单:当完成动画,开始执行下一个开始动画,代码如下。
按理说写到这里应该结束了,但是可能有读者说,我们并没有引入RX,没错你的代码很优雅,然而对我们来说成本有点高,那么就继续讲讲其他的方案,总有一款适合你。
自定义操作符
我们都知道Swift有很cool的特性:自定义操作符,我们总希望把代码些简单,让别的同事看自己的代码时一目了然,都不需注释就懂什么意思,比如:
animation1 ~> animation2 ~> animation3 ~> animation4
很简单,自定义~>操作符如下:
接下来使用这个操作符实现动画
好了,自此关于如何避免写出丑陋的嵌套动画代码写完了,enjoy
--END--
#iOSTips 周报#1|2018-12-10
上周六首次尝试发周报,没想到竟然用了要收费的短链接,真的尴尬后台很多问号脸,这里重发一下,微信公众号不支持外链, 点击 阅读原文 可跳转对应的外链。
【资讯】
App Store Connect will be on vacation December 23 to 27 (Pacific Time)
每年惯例,Appstore将在12月23至27日停止App审核
Flutter 1.0 正式版: Google 的便携 UI 工具包
Flutter 是 Google 为您打造的 UI 工具包,帮助您通过一套代码同时在 iOS 和 Android 上构建媲美原生体验的精美应用!
连续2周免费榜第一的ZEPETO刷爆朋友圈
一个ins捏脸软件最近突然爆红,这是一款可自定义捏人偶制作表情的客户端应用,叫做《Zepeto》,这款软件能让平面变立体,将虚拟变实物,全新视角,多样玩法,神奇体验。
【热文】
冷启动时长是App性能的重要指标,作为用户体验的第一道“门”,直接决定着用户对App的第一印象,本文分享了美团iOS端冷启动的治理经验。
Implementing features with ReactiveFeedback
本文作者通过一个实例演示来介绍他们团队写的单向数据流应用框架 ReactiveFeedback。由于作者所在团队用的是 ReactiveCocoa,所以他们就基于 ReactiveSwift 自己实现了一套类似 RxFeedback 的框架。
The Right Way to Architect iOS App with Swift
来自limboy大神介绍了对iOS 架构的看法与自己的思考
【源码】
RichTextView
iOS Text View (UIView) that Properly Displays LaTeX, HTML, Markdown, and YouTube/Vimeo Links
Marionette
Swift library which provides a high-level API to control a WKWebView
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 序列化和反序列化的底层实现原理是什么?
- golang实现php里的serialize()和unserialize()序列和反序列方法
- java序列化的内部实现(一)
- 详解动态规划最长公共子序列--JavaScript实现
- 序列帧&一镜到底H5开发实现分析
- Python实现JSON反序列化类对象
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据密集型应用系统设计
Martin Kleppmann / 赵军平、李三平、吕云松、耿煜 / 中国电力出版社 / 2018-9-1 / 128
全书分为三大部分: 第一部分,主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第1章即瞄准目标:可靠性、可扩展性与可维护性,如何认识这些问题以及如何达成目标。第2章我们比较了多种不同的数据模型和查询语言,讨论各自的适用场景。接下来第3章主要针对存储引擎,即数据库是如何安排磁盘结构从而提高检索效率。第4章转向数据编码(序列化)方面,包括常见模式的演化历程。 第二部分,我们将......一起来看看 《数据密集型应用系统设计》 这本书的介绍吧!
UNIX 时间戳转换
UNIX 时间戳转换
正则表达式在线测试
正则表达式在线测试