Swift - CALayer的contents属性动画

效果

源码

https://github.com/YouXianMing/Swift-Animations

//
//  LiveImageView.swift
//  Swift-Animations
//
//  Created by YouXianMing on 16/8/17.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

import UIKit

// MARK: Public class : LiveImageView

class LiveImageView: UIImageView {

    // MARK: Properties.

    /// Animation‘s duration.
    var duration : CFTimeInterval = 0.3

    // MARK: Methods.

    /**
     Set image with animation or not.

     - parameter newVal:   The new image.
     - parameter animated: Animated or not.
     */
    func setImage(newVal : UIImage, animated : Bool) {

        if animated == true {

            let animation       = CABasicAnimation(keyPath: "contents")
            animation.fromValue = image?.CGImage
            animation.toValue   = newVal.CGImage
            animation.duration  = duration

            pLayer.contents = image?.CGImage
            pLayer.addAnimation(animation, forKey: nil)

            image = newVal

        } else {

            image = newVal
        }
    }

    // MARK: Private value & func.

    private var pLayer : CALayer!

    override init(frame: CGRect) {

        super.init(frame: frame)
        pLayer = layer
    }

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")
    }
}
//
//  LiveImageViewController.swift
//  Swift-Animations
//
//  Created by YouXianMing on 16/8/17.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

import UIKit

class LiveImageViewController: NormalTitleViewController {

    var timer  : GCDTimer!  = GCDTimer(inQueue: GCDQueue.mainQueue)
    var count  : NSInteger! = 0
    var images : [UIImage]! = [UIImage]()

    override func setup() {

        super.setup()

        images = [UIImage]()
        images.append(UIImage(named: "pic_1")!)
        images.append(UIImage(named: "pic_2")!)
        images.append(UIImage(named: "pic_3")!)
        images.append(UIImage(named: "pic_4")!)

        let image                       = images[0]
        let liveImageView               = LiveImageView(frame: CGRectMake(0, 0, image.size.width, image.size.height))
        liveImageView.center            = (contentView?.middlePoint)!
        liveImageView.layer.borderWidth = 3
        liveImageView.layer.borderColor = UIColor.blackColor().CGColor
        liveImageView.duration          = 0.5
        contentView?.addSubview(liveImageView)

        weak var wself = self
        timer.event({

            let currentIndex = (wself?.count)! % (wself?.images.count)!
            wself?.count     = (wself?.count)! + 1

            liveImageView.setImage(wself!.images[currentIndex], animated: true)

            UIView.animateWithDuration(0.5, animations: {

                var tmpRect          = liveImageView.bounds
                tmpRect.size         = (liveImageView.image?.size)!
                liveImageView.bounds = tmpRect
                liveImageView.center = (wself?.contentView?.middlePoint)!
            })

            }, timeIntervalWithSeconds: 1.0)

        timer.start()
    }
}
时间: 2024-08-02 07:04:00

Swift - CALayer的contents属性动画的相关文章

iOS开发UI篇—CAlayer层的属性

一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) @property CGPoint anchorPoint; 称为“定位点”.“锚点” 决定着CALayer身上的哪个点会在position属性所指的位置 以自己的左上角为原点(0, 0) 它的x.y取值范围都是0~1,默认值为(0.

iOS开发UI 篇—CAlayer层的属性

一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) @property CGPoint anchorPoint; 称为“定位点”.“锚点” 决定着CALayer身上的哪个点会在position属性所指的位置 以自己的左上角为原点(0, 0) 它的x.y取值范围都是0~1,默认值为(0.

iOS开发UI篇—CAlayer层的属性(转摘)

iOS开发UI篇—CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) @property CGPoint anchorPoint; 称为“定位点”.“锚点” 决定着CALayer身上的哪个点会在position属性所指的位置 以自己的左上角为原点(0, 0) 它

Swift 关闭视图的过度动画 eg:CollectionView ,TableView

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #1e9421; background-color: #ffffff } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Menlo; color: #3e1e81; background-color: #ffffff } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; fo

android属性动画

一.概述 android动画总共分为三种逐帧动画.补间动画.属性动画. 逐帧动画:主要就是将几张图片放在一起播放形成动画. 补间动画:补间动画还是比较局限的,能实现view的旋转.横竖拉伸.横竖平移.透明度等简单的变化. 由于android速度发展之快,原有的两种动画已经不能满足我们的需求,所以android在3.0版本推出了一个高大上的动画效果,属性动画. 二.相关API: ValueAnimator:属性动画的执行类,主要负责计算各个帧所对应的属性的值,可以处理动画的更新事件,它可以定义属性

属性动画

属性(Property)动画 属性(Property)动画:安卓提供的众多动画中的一种,从某种角度来看,属性动画实际上是增强版的补间(Tween)动画. 属性动画主要由两方面组成: 1.计算各帧的相关属性值. 2.给指定的对象设置相关的属性值. 区别: 1.补间(Tween)动画只能够操控各种组件的透明度(alpha),位置(translate), 旋转(rotate)和放缩(scale)四种属性进行相应的变换,但是属性(Property)动画可以对任何的属性值做出改变. 2.补间(Tween)

属性动画导致的内存泄露

属性动画中有一类无线循环的动画,如果在Activity中播放此类动画而且没有在onDestory中去 停止动画.那么动画会一直播放下去,尽管已经看不到动画效果了.并且这个时候Activity的View会被动画持有.而View又持有了Activity无法释放.下面动画是无线循环,会泄露当前的Activity,解决办法是在Activity的onDestory中调用animator.cancel(): animator.cancel(): 

Android开发实战之补间动画和属性动画

说起动画,其实一点也不陌生,在使用一款app的时候为了优化用户体验,多多少少的,都会加入动画. 安卓中的动画,分为两大类:补间动画和属性动画.本篇博文会详细介绍总结这两大动画,希望本篇博文对你的学习和生活有所帮助. **补间动画** 补间动画分为四类:平移动画,旋转动画,缩放动画和渐变动画.这几类动画用法都差不多,只是对象参数不同这里我统一展示出来.以下是效果图: 实现代码很简单: btn1.setOnClickListener(new View.OnClickListener() { @Ove

【转】android 属性动画之 ObjectAnimator

原文网址:http://blog.csdn.net/feiduclear_up/article/details/39255083 前面一篇博客讲解了 android 简单动画之 animtion,这里来讲解一下android 3.0之后添加的一些动画   animator 中的 ObjectAnimator . 属性动画概念: 所谓属性动画:改变一切能改变的对象的属性值,不同于补间动画:只能改变 alpha,scale,rotate,translate.听着有点抽象,举例子说明 补间动画能实现的