第三方开源动画库EasyAnimation中一个小bug的修复
看过iOS动画之旅的都知道,其中在最后提到一个作者写的开源动画库EasyAnimation(以下简称EA).
EA对CoreAnimation中的view和layer动画做了更高层次的包装和抽象,使得我们可以大大减少编写代码的行数.
不过在玩耍EA时发现了点小问题,在使用链式串行调用中其中的某一段若为弹簧动画,则该动画后面的其他动画都无法再运行了.
以下是测试代码:
@IBAction func actionAddItem(sender: AnyObject) {
plusButton.enabled = false
UIView.animateAndChainWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.33, initialSpringVelocity: 0.0, options: [], animations: {
//1
self.plusButton.transform = CGAffineTransformRotate(self.plusButton.transform, CGFloat(-M_PI_2))
}, completion: {_ in
self.addRandomItem()
}).animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.33, initialSpringVelocity: 0.0, options: [], animations: {
//2
self.plusButton.layer.cornerRadius = 62.5
self.plusButton.layer.borderWidth = 2.0
self.plusButton.layer.borderColor = UIColor.grayColor().CGColor
}, completion: nil).animateWithDuration(0.15, delay: 0.5, options: [.CurveEaseOut,/*.Repeat*/], animations: {
//3
self.plusButton.layer.cornerRadius = 0.0
self.plusButton.layer.borderWidth = 0.0
self.plusButton.layer.borderColor = UIColor.clearColor().CGColor
}, completion: {_ in
self.plusButton.enabled = true
})
}
以上我们总共串行执行了3段动画,上面数字注释分别依次指明当前的动画段.
在第一段中我们旋转按钮,在第二段动画中我们修改按钮的边角,边线的样式,在最后一段中我们恢复第二段中做的样式修改.
注意第二段中我们使用了弹簧动画,执行App你会发现第三段动画无法被触发!
cmd+鼠标左键点击第二段中的弹簧动画,我们看一下EA源代码:
public func animateWithDuration(duration: NSTimeInterval, delay: NSTimeInterval, usingSpringWithDamping dampingRatio: CGFloat, initialSpringVelocity velocity: CGFloat, options: UIViewAnimationOptions, animations: () -> Void, completion: ((Bool) -> Void)?) -> EAAnimationDelayed {
let anim = animateAndChainWithDuration(duration, delay: delay, options: options, animations: animations, completion: completion)
self.springDamping = dampingRatio
self.springVelocity = velocity
return anim
}
其中返回了另一个EAAnimationDelayed对象,我们再看一下animateAndChainWithDuration这个方法:
public func animateAndChainWithDuration(duration: NSTimeInterval, delay: NSTimeInterval, options: UIViewAnimationOptions, animations: () -> Void, completion: ((Bool) -> Void)?) -> EAAnimationDelayed {
var options = options
if options.contains(.Repeat) {
options.remove(.Repeat)
loopsChain = true
}
self.duration = duration
self.delay = delay
self.options = options
self.animations = animations
self.completion = completion
nextDelayedAnimation = EAAnimationDelayed()
nextDelayedAnimation!.prevDelayedAnimation = self
return nextDelayedAnimation!
}
如你所见,该方法只是简单的把CoreAnimation动画中的一些参数放到EAAnimationDelayed对象中来,同时很重要的一步是在方法最后建立EAAnimationDelayed执行链.
我们最后看一下执行链是如何执行的,看一下run方法:
func run() {
if debug {
print("run animation #\(debugNumber)")
}
//TODO: Check if layer-only animations fire a proper completion block
if let animations = animations {
options.insert(.BeginFromCurrentState)
let animationDelay = dispatch_time(DISPATCH_TIME_NOW, Int64( Double(NSEC_PER_SEC) * self.delay ))
dispatch_after(animationDelay, dispatch_get_main_queue()) {
if self.springDamping > 0.0 {
//spring animation
UIView.animateWithDuration(self.duration, delay: 0, usingSpringWithDamping: self.springDamping, initialSpringVelocity: self.springVelocity, options: self.options, animations: animations, completion: self.animationCompleted)
} else {
//basic animation
UIView.animateWithDuration(self.duration, delay: 0, options: self.options, animations: animations, completion: self.animationCompleted)
}
}
}
}
注意,其中根据springDaming属性的值决定调用何种动画方法!但是在前面EA的animateWithDuration方法中我们赋值的是self的属性,而不是anim的属性!
将EA源代码中上面两句赋值语句修改如下:
anim.springDamping = dampingRatio
anim.springVelocity = velocity
再次运行,可以看到恢复动画可以正常运行了:]
第三方开源动画库EasyAnimation中一个小bug的修复的更多相关文章
- Facebook开源动画库 POP-POPBasicAnimation运用
动画在APP开发过程中还是经常出现,将花几天的时间对Facebook开源动画库 POP进行简单的学习:本文主要针对的是POPBasicAnimation运用:实例源代码已经上传至gitHub,地址:h ...
- rebound是facebook的开源动画库
网址:http://www.jcodecraeer.com/a/opensource/2015/0121/2338.html 介绍: rebound是facebook的开源动画库.可以认为这个动画库是 ...
- 关于一个小bug的修正
python初学者,非常喜欢虫师的文章. 练习时发现一个小bug,http://www.cnblogs.com/fnng/p/3782515.html 验证邮箱格式一题中,第三个x不允许有数字,但是测 ...
- iOS开发之使用UICollectionView实现美团App的分类功能【偶现大众点评App的一个小bug】
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...
- js动画--一个小bug处理下
对于上面的课程我们很好的处理了一个小bug,那么我们现在讲程序进行优化一下,前一节的程序中,我们处理处理的属性都是写死了的.为了我们能够很好的对某个属性进行操作的话.我们这样来设置. js文件 win ...
- 从一个小Bug,到Azure DevOps
1. 一个小Bug 最近和同事提起一个几年前的 Bug,那是一个很小很小的 Bug,没什么技术含量.那时候我刚入职,正好公司卖了一款仪器到某个国家,但是那边说配套的软件运行不起来,一打开就报错.经过排 ...
- Flutter实战视频-移动电商-34.列表页_小BUG的修复
34.列表页_小BUG的修复 当高粱酒的子类没有数据返回的时候就会报错. 解决接口空数据报错的问题 没有数据的时候,给用户一个友好的提示, 我们没有数据的时候还要告诉用户,提示一下他没有数据,在我们的 ...
- Lottie安卓开源动画库使用
碉堡的Lottie Airbnb最近开源了一个名叫Lottie的动画库,它能够同时支持iOS,Android与ReactNative的开发.此消息一出,还在苦于探索自定义控件各种炫酷特效的我,兴奋地就 ...
- 关于 JavaScript 中一个小细节问题 (在控制台中直接 {Name:'王尼玛',Age:20} 对象报错问题)
在 Chrome 浏览器,大家可能遇到这样一个小问题. 随便输入一个 Object 对象 ,比如 {Name:'王尼玛',Age:20} ,将会报错.之前,也从来没去考虑过到底是为啥原因. 今天,刚 ...
随机推荐
- 浅谈轮播图(原生JavaScript实现)
现在各种轮播图插件,玲琅满目,用起来也非常方便,通常只需要选择元素然后传入参数就可以了.但是,和授人以鱼不如授人以渔一样的道理,不管怎样最基本的轮播图原理还是应当掌握的.这样不仅有利于我们自己写出来满 ...
- for-each的坑(Hollis)
直接用代码来说明: public class ForEach { public static void main(String[] args) { List<String> list = ...
- [JSOI 2011]分特产
Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望 ...
- [ZJOI2006]超级麻将
题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...
- ●洛谷 P3616 富金森林公园
题链: https://www.luogu.org/problemnew/show/3616 题解: 树状数组,,, 本题思路挺巧妙. 考虑这种暴力算法:(设H[i]为i位置的高度,水面的高度为B) ...
- hdu 4283 区间dp
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 【bzoj4572 scoi2016】围棋
题目描述 近日,谷歌研发的围棋AI—AlphaGo以4:1的比分战胜了曾经的世界冠军李世石,这是人工智能领域的又一里程碑. 与传统的搜索式AI不同,AlphaGo使用了最近十分流行的卷积神经网络模型. ...
- 关于InnoDB的读写锁类型以及加锁方式
(本文为了方便,英文关键词都都采用小写方式,相关知识点会简单介绍,争取做到可以独立阅读) 文章开始我会先介绍本文需要的知识点如下: innodb的聚簇索引(聚集索引)和非聚簇索引(二级索引.非聚集索引 ...
- strings.h 与 string.h 头文件的区别
今天使用 man string 来查看 string 文件的使用的方法(毕竟里面的函数名字和传入参数和发挥参数的类型,如果一段时间不使用,会产生遗忘.) 偶然发现,string.h 的man page ...
- Linux学习之CentOS(十七)-----释放 Linux 系统预留的硬盘空间 与Linux磁盘空间被未知资源耗尽 (转)
释放 Linux 系统预留的硬盘空间 大多数文件系统都会保留一部分空间留作紧急情况时用(比如硬盘空间满了),这样能保证有些关键应用(比如数据库)在硬盘满的时候有点余地,不致于马上就 crash,给监 ...