分类 核心动画 下的文章

核心动画,图标抖动

//
//  ViewController.swift
//  图标抖动
//
//  Created by admin on 16/1/27.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    @IBAction func start(sender: AnyObject) {
        let animation = CAKeyframeAnimation(keyPath: "transform.rotation")
        // 设置path
        animation.values = [-CGFloat(M_PI * 0.1),CGFloat(M_PI * 0.1),-CGFloat(M_PI * 0.1)]
        // 设置重复次数
        animation.repeatCount = Float(CGFloat.max)
        self.imageView.layer.addAnimation(animation, forKey: "shark")
    }
    @IBAction func stop(sender: AnyObject) {
        // 停止动画
        self.imageView.layer.removeAnimationForKey("shark")
    }
}

核心动画CAKeyframeAnimation

//
//  ViewController.swift
//  帧动画
//
//  Created by admin on 16/1/27.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.imageView.layer.position = CGPointMake(0, 0)
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let animation = CAKeyframeAnimation(keyPath: "position")
        let imageX = self.imageView.layer.position.x
        let imageY = self.imageView.layer.position.y
        // 第一个位置设置成图层本身的position,不对的话会不好看,会抖一下
        let v1 = NSValue.init(CGPoint: self.imageView.layer.position)
        let v2 = NSValue.init(CGPoint: CGPointMake(imageX + 300,imageY))
        let v3 = NSValue.init(CGPoint: CGPointMake(imageX + 300,imageY + 300))
        let v4 = NSValue.init(CGPoint: CGPointMake(imageX,imageY + 300))
        // 时间
        animation.duration = 10
        // 动画路径
        animation.values = [v1,v2,v3,v4,v1]
        // 节奏
        // kCAMediaTimingFunctionLinear : 匀速
        // kCAMediaTimingFunctionDefault : 慢 -> 快 -> 超级慢
        // kCAMediaTimingFunctionEaseIn : 慢 -> 快 -> 匀速
        // kCAMediaTimingFunctionEaseInEaseOut : 慢 -> 快 -> 慢
        // kCAMediaTimingFunctionEaseOut : 快 -> 慢
        animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        // 使用path,因为这里画的是一个圆,所以会沿着这个圆动,
        var path:CGMutablePathRef! = CGPathCreateMutable()
        let screenW = UIScreen.mainScreen().bounds.size.width
        CGPathAddEllipseInRect(path, nil, CGRectMake(0, 0, screenW, screenW))
        // 设置path,path的优先级大于values,所以会执行path
        animation.path = path
        path = nil
        self.imageView.layer.addAnimation(animation, forKey: nil)
    }
}

核心动画CABasicAnimation

//
//  ViewController.swift
//  核心动画
//
//  Created by admin on 16/1/27.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        self.imageView.layer.contents = UIImage(imageLiteral: "3").CGImage

        // Do any additional setup after loading the view, typically from a nib.
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.scale()
    }
    // 缩放
    func scale()
    {
        // 这个属性
        let animation = CABasicAnimation()
        animation.keyPath = "transform.scale"
//        animation.toValue = NSValue.init(CATransform3D: CATransform3DMakeScale(1.5, 1.5, 1.5))
        animation.byValue = NSValue.init(CATransform3D: CATransform3DMakeScale(1.5, 1.5, 1.5))
//        self.imageView.layer.transform = CATransform3DMakeScale(1.5, 1.5, 1.5)
        animation.removedOnCompletion  = false
        animation.fillMode = kCAFillModeForwards
        self.imageView.layer.addAnimation(animation, forKey: nil)
    }
    // 旋转
    func rotation()
    {
        // 这个属性
        let animation = CABasicAnimation()
        // 逐个修改
//        animation.keyPath = "transform.rotation.x"
//        animation.byValue = CGFloat(M_PI)
//        animation.removedOnCompletion = false
//        animation.fillMode = kCAFillModeForwards
        // 直接修改多个坐标
        animation.keyPath = "transform.rotation"
        self.imageView.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI), 1, 1, 1)
        self.imageView.layer.addAnimation(animation, forKey: nil)
    }
    // 平移动画
    func translation()
    {
        let animation = CABasicAnimation()
        // 同时改变横向和纵向
        animation.keyPath = "transform.translation"
        // 从这个位置开始
//        animation.fromValue = NSValue.init(CGPoint: CGPointMake(10, 10))
        // 每次动画执行之后都会改变的距离
        animation.byValue = NSValue.init(CGPoint: CGPointMake(20, 20))
        // 在第一次执行动画的时候会发生偏移,然后无效了
//        animation.toValue = NSValue.init(CGPoint: CGPointMake(30, 30))
//        animation.keyPath = "transform.translation.x"
//        animation.byValue = 20
        animation.removedOnCompletion = false
        animation.fillMode = kCAFillModeForwards
        // 直接对属性进行赋值也是ok的
//        self.imageView.layer.transform = CATransform3DMakeTranslation(100, 100, 10)

        // 单独改变一个方向
        animation.keyPath = "transform.translation.x"
        animation.byValue = 10

        self.imageView.layer.addAnimation(animation, forKey: nil)
    }
    // bounds的动画效果
    func bounds()
    {
        // 实例化动画对象
        let animation = CABasicAnimation()
        // 设置监听的属性名
        animation.keyPath = "bounds"
        // 使用这个的话会有动画效果,并且动画执行完毕也不会回到原来的状态
        //        self.imageView.layer.bounds = CGRectMake(0, 0, 100, 100)
        // 使用这个会执行动画效果,但是结束之后会回到原来的状态,如果不希望恢复,需要设置下面两个属性
        animation.toValue = NSValue.init(CGRect: CGRectMake(0, 0, 100, 100))
        //        // 不设置下面两项的话动画执行完毕会回到原来的状态
        animation.removedOnCompletion = false
        animation.fillMode = kCAFillModeForwards
        animation.duration = 10
        // 给图层添加动画
        self.imageView.layer.addAnimation(animation, forKey: nil)
    }
}