Swift语言实现地图坐标弹跳动画

 更新时间:2015年07月24日 14:31:44   作者:迷思的猫  
这篇文章主要介绍了用Swift语言实现地图坐标弹跳动画的方法主要应用iOS7来实现此功能,需要的朋友可以参考下

下面应用Swift语言做地图坐标实现弹簧跳动的效果,具体实现方法如下所示:

iOS动画大概分这几种:

CoreAnimation动画(基础)UIView动画(animateWithDuration开头的函数,带弹簧特效)UIDynamic动画(有物理引擎)

上次写弹跳动画,由于刚开始学,就用了最基础的CA动画,但是因为自己不会写KeyFrame,所以还引用了一个开源库来实现下坠的弹跳效果,这样固然是实现了需求,但是一点都不优雅——从iOS7开始,有了2、3两种动画,就不再需要用老的CA动画去一点一点拔了。做这个动画的正确姿势,应该是下面这样~

我们的需求仍然是这个弹跳的marker:

这次我用了2、3两种方式实现,效果如下:

一、UIView动画

之前使用CABasicAnimation实现,不仅代码多,还要用CATransaction控制回来的一趟callback。其实直接用iOS7的UIView动画就搞定了:

UIView.animateWithDuration(0.2, 
animations: 
{ self.marker.layer.position.y -= 30 },
completion: {(finished) in UIView.animateWithDuration(0.5, delay: 0,
usingSpringWithDamping: 0.2,
initialSpringVelocity: 5.0,
options: UIViewAnimationOptions.CurveEaseOut,
animations: {//弹性参数的调教,可以参见本文的“参考”部分 
self.marker.layer.position.y += 30 }, 
completion: nil)})

在上升过程中,直接在0.2s的时间中,向上移动30px;向下过程中,为了表示弹跳的效果,使用了Spring系列参数,做了一下调整之后,感觉效果还是挺有意思的。但是单纯使用这个有一个缺点:我们要的是类似于重力下坠,而非像一根弹簧一样弹到那个位置。注意那跟蓝色的比较线,我们实现的是左边的效果,在动画过程中,它会超过那根蓝色线条,所以其实是不符合需求的。

二、UIDynamic动画

UIDynamic动画是有物理引擎的动画,我们只需要设定这个“物体”的物理特性,iOS就会自动帮我们进行物理世界的动画运算。首先我们创建它的物理特性:

var animator : UIDynamicAnimator?override func viewDidLoad() { 
super.viewDidLoad() 
animator = UIDynamicAnimator(referenceView: view)}
override func viewDidAppear(animated: Bool) { 
let gravity = UIGravityBehavior(items: [marker2])//重力 
let elastic = UIDynamicItemBehavior(items: [marker2])//弹性 
elastic.elasticity = 0.6 let collision = UICollisionBehavior(items: [marker2])//边缘 
let endY = marker2.frame.origin.y + marker2.frame.height//
记录marker2的底部坐标 
collision.addBoundaryWithIdentifier("floor", fromPoint: CGPoint(x: 0, y: endY),
toPoint: CGPoint(x: UIScreen.mainScreen().bounds.width, y: endY))//在marker2的底部画一条线,从屏幕左边到屏幕右边 
animator!.addBehavior(collision) 
animator!.addBehavior(gravity) 
animator!.addBehavior(elastic)}


首先我们创建一个animator,然后创建关于marker2的重力、弹性、边缘三个属性,附加在animator上。于是这个marker2便有了物理特性。然后我们和以前一样把它抬高:

UIView.animateWithDuration(0.2, 
animations: { 
self.marker2.layer.position.y -= 30 }, 
completion: {(finished : Bool) in 
self.animator!.updateItemUsingCurrentState(self.marker2)//如果不update,则animator不知道它的位置被移动过了})

在动画完成后,让animator重新对它进行活动,就达到了文章开始的gif图中,第二个marker的弹跳效果。

文章到此为止,希望对大家有所帮助,谢谢。

相关文章

  • Swift 3.0基础学习之闭包

    Swift 3.0基础学习之闭包

    Swift引进了闭包的概念,这个与object-c的block类似,使用过block的话都知道有多方便,所以开始学Swift,先要把闭包学会,后面使用会很频繁。下面这篇文章主要介绍了Swift 3.0基础学习之闭包的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • Swift 并发修改Sendable 闭包实例详解

    Swift 并发修改Sendable 闭包实例详解

    这篇文章主要为大家介绍了Swift 并发修改Sendable 闭包实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • SwiftUI自定义导航的方法实例

    SwiftUI自定义导航的方法实例

    导航是我们平时经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于SwiftUI自定义导航的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Swift的74个常用内置函数介绍

    Swift的74个常用内置函数介绍

    这篇文章主要介绍了Swift的74个常用内置函数介绍,这篇文章列举出了所有的Swift库函数,内置函数是指无需引入任何模块即可以直接使用的函数,需要的朋友可以参考下
    2015-01-01
  • Swift reduce函数使用示例详解

    Swift reduce函数使用示例详解

    这篇文章主要为大家介绍了Swift reduce函数使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 深入讲解Swift的内存管理

    深入讲解Swift的内存管理

    不管在什么语言里,内存管理的内容都很重要,Swift使用自动引用计数来管理应用程序的内存使用。这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理。本文主要介绍了Swift中内存管理的相关资料,需要的朋友可以参考。
    2017-03-03
  • Swift实现无限轮播效果

    Swift实现无限轮播效果

    这篇文章主要为大家详细介绍了Swift无限轮播效果实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 浅谈在Swift中关于函数指针的实现

    浅谈在Swift中关于函数指针的实现

    这篇文章主要介绍了浅谈在Swift中关于函数指针的实现,是作者根据C语言的指针特性在Swifft中做出的一个实验,需要的朋友可以参考下
    2015-07-07
  • 详解Swift中的函数及函数闭包使用

    详解Swift中的函数及函数闭包使用

    Swift的函数在创建和调用时非常简洁,在编写具有闭包特性的函数时同样也相当方便,以下我们就来详解Swift中的函数及函数闭包使用:
    2016-06-06
  • 利用Swift实现各类的CATransition动画详解

    利用Swift实现各类的CATransition动画详解

    CATransition动画主要在过渡时使用,比如两个页面层级改变的时候添加一个转场效果。CATransition分为两类,一类是公开的动画效果,一类是非公开的动画效果。这篇文章主要给大家介绍了关于如何利用Swift实现各类CATransition动画的相关资料,需要的朋友可以参考下。
    2017-09-09

最新评论