iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题

本文转载至 http://www.tuicool.com/articles/aANBF3m

时间 2014-12-07 20:13:37  segmentfault-博客原文  http://segmentfault.com/blog/alan/1190000002411296

iOS的各种动画相漂亮,相信这是吸引很多人买iPhone的原因之一。不仅如此,这还是吸引我做iOS开发的一大原因,因为在iOS上给界面实现一些像样的动画实在是太轻松了!

这里就介绍一下iOS的block-based animation的简单用法。文后有一个坑爹问题的临时解决方法,请知情人不吝赐教。

首先是实现下面的动画:

let mView = view.viewWithTag(1) as UIView!

mView.alpha = 0

UIView.animateWithDuration(1, animations: {
    mView.alpha = 1
  }, completion: {
    finished in

    UIView.animateWithDuration(1, animations: {
      mView.alpha = 0
    })

  })

新建一个 singleView 模版,在 storyboard 里加入一个 View ,颜色随便设, tag 设置成1.

然后把上文代码粘贴进 view controller 的 viewDidLoad 方法中,运行即可。

block-base 动画的用法非常简单,先设置初始状态,再在animationWithDuration 或其他动画方法的 animations 里设置结束的状态,其他的全部不用管。

上文代码中,首先让 mView 的透明度从0动画到1,然后在 completion 的 closure 中再次设置一个动画,让 mView 的透明度回到0。

View的许多属性都可以用这种方式进行动画,文档中有详细列表。

关键帧动画

UIView.animateKeyframesWithDuration(2.0,						// 持续时间
             delay: 0,
           options: UIViewKeyframeAnimationOptions.Repeat,  // 设置重复播放
        animations: {

    // 第一个关键帧,alpha从0到1
    UIView.addKeyframeWithRelativeStartTime(0,   // 开始时间
          relativeDuration: 0.5, // 持续时间
            animations: {
    mView.alpha = 1
    })

    // 第二个关键帧,alpha从1到0
    UIView.addKeyframeWithRelativeStartTime(0.5,
          relativeDuration: 0.5,
            animations: {
    mView.alpha = 0
    })

}, completion: nil)

还是实现上面一样的动画,但这次的方式相对要更加好一些。(针对这个例子其实我更喜欢前一段代码。。。)

需要注意的一点是addKeyframeWithRelativeStartTime中的startTime和relativeDuration都是相对与整个关键帧动画的持续时间(这里是2秒)的百分比,设置成0.5就代表2*0.5=1(秒)。

坑爹货

在实现上面的效果的时候遇到了一个问题:iOS这些动画默认的变化速度是开始结束慢,中间快,于是这种循环动画的效果就不均匀。临时解决办法如下:

// 不知道Apple建不建议把 UIViewAnimationOption 用在这里,但这两行确实解决了问题。
let raw = UIViewKeyframeAnimationOptions.Repeat.rawValue | UIViewAnimationOptions.CurveLinear.rawValue
let options = UIViewKeyframeAnimationOptions(raw)

UIView.animateKeyframesWithDuration(2.0, delay: 0, options: options, animations: {
  UIView.addKeyframeWithRelativeStartTime(0, relativeDuration: 0.25, animations: {
    mView.alpha = 1
    mView1.alpha = 0
    mView2.alpha = 1
    mView3.alpha = 1
  })
  UIView.addKeyframeWithRelativeStartTime(0.25, relativeDuration: 0.25, animations: {
    mView.alpha = 1
    mView1.alpha = 1
    mView2.alpha = 0
    mView3.alpha = 1
  })
  UIView.addKeyframeWithRelativeStartTime(0.5, relativeDuration: 0.25, animations: {
    mView.alpha = 1
    mView1.alpha = 1
    mView2.alpha = 1
    mView3.alpha = 0
  })
  UIView.addKeyframeWithRelativeStartTime(0.75, relativeDuration: 0.25, animations: {
    mView.alpha = 0
    mView1.alpha = 1
    mView2.alpha = 1
    mView3.alpha = 1
  })
}, completion: nil)

原来以为关键帧动画的参数 UIViewKeyframeAnimationOptions.CalculationModeLinear 可以解决这个问题,但好像理解错了,文档里也没有提到别的办法。折腾半天快放弃的时候,误打误撞用了UIViewAnimationOptions.CurveLinear,居然解决了。又回头翻文档,确认了文档真的没有写。。。呵呵(有人找到请告诉我。。。)

时间: 2024-10-03 23:04:13

iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题的相关文章

IOS 中block结构的简单用法

自从block出现之后,很多API都开始采用这样的结构,由此可见,block确实有许多优势存在,这里将一些简单用法总结如下: 一.如何声明一个block变量 我们通过^符号来声明block类型,形式如下: void (^myBlock)(); 其中第一个void是返回值,可以是任意类型,中间括号中^后面的是这个block变量的名字,我把它命名为myBlock,最后一个括号中是参数,如果多参数,可以写成如下样式: int (^myBlock)(int,int); 同样,你也可以给参数起名字: in

IOS第18天(6,CAKeyframeAnimation关键帧动画)

******* #import "HMViewController.h" @interface HMViewController () @property (weak, nonatomic) IBOutlet UIView *redView; @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading t

ios初识UITableView及简单用法二(模型数据)

// // ViewController.m // ZQRTableViewTest // // Created by zzqqrr on 17/8/24. // Copyright (c) 2017年 zzqqrr. All rights reserved. // #import "ViewController.h" #import "ZQRCarGroup.h" @interface ViewController () <UITableViewDataSo

ios初识UITableView及简单用法

// // ViewController.m // ZQRTableViewTest // // Created by zzqqrr on 17/8/24. // Copyright (c) 2017年 zzqqrr. All rights reserved. // #import "ViewController.h" @interface ViewController () <UITableViewDataSource> @property (weak,nonatomic

IOS动画(3)关键帧动画

关键帧动画中的时间系统,模型树和呈现树与基础动画一致,这里主要介绍关键帧动画的用法 CAKeyframeAnimation - (void)viewDidLoad { [super viewDidLoad]; CALayer *layer = [CALayer layer]; layer.bounds = CGRectMake(0, 0, 120, 120); layer.position = CGPointMake(100, 300); layer.cornerRadius = 60; lay

iOS核心动画高级技巧之核心动画(三)

iOS核心动画高级技巧之CALayer(一) iOS核心动画高级技巧之图层变换和专用图层(二)iOS核心动画高级技巧之核心动画(三)iOS核心动画高级技巧之性能(四)iOS核心动画高级技巧之动画总结(五) 隐式动画 隐式动画主要作用于CALayer的可动画属性上面,UIView对应的layer是不可以的,只要你改变属性的值,它不是突兀的直接改变过去,而是一个有一个动画的过程,这个时间等属性你可以通过事务(CATransaction)来控制,如果你不自己提供一个事务,它的默认时间是0.25秒,当然

Windows Store App 关键帧动画

关键帧动画和插值动画类似,同样可以根据目标属性值的变化产生相应的动画效果,不同的是,插值动画是在两个属性值之间进行渐变,而关键帧动画打破了仅通过两个属性值控制动画的局限性,它可以在任意多个属性值之间进行变化,这种变化方式可以是线性渐变也可以是瞬间突变.开发人员可以根据应用本身的需求,通过不同的关键帧设置动画元素的多个属性值,制作出更加复杂和绚丽的动画效果. 1.DoubleAnimationUsingKeyFrames关键帧动画 DoubleAnimationUsingKeyFrames关键帧动

iOS 8:CAKeyframeAnimation实现界面晃动动画

QQ空间在输错帐号或密码时会一左一右晃动,这种动画可使用关键帧动画实现. - (void)shakeView:(UIView *)view { CAKeyframeAnimation *shakeAnimation = [CAKeyframeAnimation animation]; shakeAnimation.keyPath = @"transform.translation.x"; CGFloat margin = 10; shakeAnimation.values = @[@(

WPF中的动画——(五)关键帧动画

与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值. 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多个状态之间变化,例如,对于前面那个改变按钮宽度的例子,如果我们要实现如下效果: 在2秒时将宽度从 0变为350 在7秒时将宽度变为50 在9秒的时候将其宽度变为200 虽然我们可以用三个From/To/By 动画组合实现类似效果,但是这样一来麻烦,二来要感知动画完成事件,不方便在XAML中使用.此时我