资讯专栏INFORMATION COLUMN

关于iOS里的做动画方法的差别与注意事项

BicycleWarrior / 2950人阅读

摘要:与这两个方式的主要差别在于,前者如果不主动设置,那么在动画做完以后,会恢复原状。好的,现在我们做一个和上面一样的轴上的位移动画。使用的是在做动画,只是细节对程序员隐藏了。所以在做动画前后都能去设置控件本身到正确的属性。

CoreAnimation与UIView.animation...

这两个方式的主要差别在于,前者如果不主动设置,那么在动画做完以后,会恢复原状。
后者则不会,动画做完后是什么样,控件就是什么样。

UIView.animation...是什么

首先我们来做一个动画

UIView.animate(withDuration: 5, animations: {
    self.moveView.frame.origin.y += 200
})

这个动画是让moveView在Y轴上移动200个点。

我们在动画代码前,打印一下这个控件的frame信息 (155.0, 140.0, 64.0, 64.0)

然后我们在动画开始2秒和动画结束时打印一下frame信息,让人疑惑的是结果都为 (155.0, 340.0, 64.0, 64.0)

我们先停一下,去看看CoreAnimation

CoreAnimation

使用CA动画时,主要是使用的CAAnimation的子类(下面简称 anim )。
anim 是添加到Layer上的,你可以在layer上访问添加到该layer的 anim 。好的,现在我们做一个和上面一样的Y轴上的位移动画。

在动画开始后的2秒打印一下frame和layer.frame信息,都是 (155.0, 140.0, 64.0, 64.0)

在2秒时打印animationKeys, Optional(["position"])

动画结束后,控件恢复到了原状,animationKeys为 nil

我们把anim改成动画结束后保持结束时状态再看看1-3点的信息

frame和layer.frame信息,也还都是 (155.0, 140.0, 64.0, 64.0)

在2秒时打印animationKeys, Optional(["position"])

动画结束后,控件恢复到了原状,animationKeys为 Optional(["position"])

此时我们使用Xcode的视图调试工具查看,控件位置在 (155.0, 140.0, 64.0, 64.0) ,并且调试界面的位置和APP上的位置完全不一样。

CoreAnimation动画的注意事项

怎么获取正在移动时的位置呢,如果有一个需求是要拿到实际运动的位置,该怎么办?
使用 presentation 属性
在CA动画里,所有的实时状态都会反应到这个属性返回的layer上,本体layer在动画时会被 隐藏 !

现在我们根据刚才的 anim 动画查看一下 presentation 的信息。

果然,控件位置的实时信息是反应在这个layer上的

回过来看UIView.animation...

我们在动画进行时打印 presentation 的信息,打印的frame信息竟然能够正确反应当前控件的位置情况。
我们再打印 animationKeys 信息看看, Optional(["position"])
我想答案已经呼之欲出了。 UIView.animation... 使用的是 CoreAnimation 在做动画,只是细节对程序员隐藏了。

两者的区别上需要注意的地方

但是还有一个问题,刚才的打印结果,_UIView.animation..._ 结束后,frame信息为 (155.0, 340.0, 64.0, 64.0) ,而 anim 结束后为 (155.0, 140.0, 64.0, 64.0) ,但是 animpresentation 的frame却是正确的。
这意味着你如果要在 anim 动画后让控件移动到正确的位置,你需要把控件的frame也设置到正确到位置,而不只是在 anim 上设置。
那什么时候设置是一个正确到时机呢?我们注意到,在开始做动画到时候,屏幕上现实的视图,实际上是显示的 presentation 的信息,而不依赖于控件本身的layer。所以在做动画前后都能去设置控件本身到正确的属性。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17158.html

相关文章

  • iOS系统中导航栏转场解决方案最佳实践

    摘要:背景目前,开源社区和业界内已经存在一些导航栏转场的解决方案,但对于历史包袱沉重的美团而言,这些解决方案并不完美。中的导航栏属于各个业务方的公用资源,由于缺乏相应的约束机制和最佳实践,导致业务方之间的代码耦合程度不断增加。 背景 目前,开源社区和业界内已经存在一些 iOS 导航栏转场的解决方案,但对于历史包袱沉重的美团 App 而言,这些解决方案并不完美。有的方案不能满足复杂的页面跳转场...

    wangbjun 评论0 收藏0
  • 献给前端求职路上你们(上)

    摘要:事件如何使用事件,以及和标准事件模型之间存在的差别以及常用的事件委托。模拟老式浏览器的行为以防止站点无法工作。首先,巧妙的使用这一标记,将游览器从所有情况中分离出来。搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于。 showImg(https://segmentfault.com/img/remote/1460000008630900); (在放大镜中寻找你) 前言 我是...

    animabear 评论0 收藏0
  • 献给前端求职路上你们(上)

    摘要:事件如何使用事件,以及和标准事件模型之间存在的差别以及常用的事件委托。模拟老式浏览器的行为以防止站点无法工作。首先,巧妙的使用这一标记,将游览器从所有情况中分离出来。搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于。 showImg(https://segmentfault.com/img/remote/1460000008630900); (在放大镜中寻找你) 前言 我是...

    jackzou 评论0 收藏0
  • 献给前端求职路上你们(上)

    摘要:事件如何使用事件,以及和标准事件模型之间存在的差别以及常用的事件委托。模拟老式浏览器的行为以防止站点无法工作。首先,巧妙的使用这一标记,将游览器从所有情况中分离出来。搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于。 showImg(https://segmentfault.com/img/remote/1460000008630900); (在放大镜中寻找你) 前言 我是...

    hiyang 评论0 收藏0
  • iOS进阶

    摘要:然而,副作用对于系统的可测试性来说就是一剂毒药,并且可能会因应用程序和请求的不同而出现差异性。这些事件并不具备特定时序性,甚至它们可能同时发生。粘性动画中,粘性小球会根据移动距离的大小拥有不同的弹性程度。 PPAsyncDrawingKit - 实现了一系列基础 UI 控件的轻量级 ASDK 一款轻量级的 ASDK,实现了一系列基础 UI 控件。 iOS 开发之 Runtime 常用示...

    Cheng_Gang 评论0 收藏0

发表评论

0条评论

BicycleWarrior

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<