CALayer相关

//CALayer是负责视图的显示,UIView是负责管理CALayer的,每创建一个控件,系统会自动生成对应的CALayer,我们可以通过UIView的layer属性访问CALayer层
        
        let subView = UIView(frame: CGRectMake(10,10,100,100))
        subView.backgroundColor = UIColor.redColor()
        self.view.addSubview(subView)
        
        
        //frame:相对父视图的坐标
        subView.layer.frame = CGRectMake(100, 100, 200, 200)
        //bounds:相对于自身的坐标
        //subView.layer.bounds = CGRectMake(0, 0, 50, 50)
        
        
        //透明度,0透明,1不透明
        subView.layer.opacity = 1
        
        //圆角
        //圆角半径
        subView.layer.cornerRadius = 10
        //剪切多余的视图
        //如果对视图要设置阴影的话,masksToBounds必须为false
        //subView.layer.masksToBounds = true
        
        
        //阴影
        //阴影的范围,shadowOffset返回值为CGSize,默认为(0,-3)
        subView.layer.shadowOffset = CGSizeMake(-10, -10)
        //阴影的颜色
        subView.layer.shadowColor = UIColor.blueColor().CGColor
        //阴影的半径.默认值为3
        subView.layer.shadowRadius = 10
        //阴影的透明度,0透明,1不透明,默认情况下是透明的
        subView.layer.shadowOpacity = 1
        
        //边框
        //边框宽度
        subView.layer.borderWidth = 3
        //边框颜色
        subView.layer.borderColor = UIColor.greenColor().CGColor
  //当前图片的索引
    var currentIndex = 0
    
    var basicLayer = CALayer()
    
    var keyframelayer = CALayer()
    
    var grouopLayer = CALayer()

    override func viewDidLoad() {
        super.viewDidLoad()
        //CoreAnimation属于CF框架中的一种,主要负责layer层复杂动画的实现,包含CABasicAnimation(基础动画)、CAKeyframeAnimation(关键帧动画)、CATransition(转场动画)、CAAnimationGroup(动画组)
        
        //基础动画
        //basicAnimation()
        //关键帧动画
        //keyframeAnimation()
        //转场动画
        transition()
        //动画组
        animationGroup()
    }
    
    //显示动画效果
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        /*
        //基础动画
        //创建基础动画,同时设置需要执行动画的属性
        let basicAnim = CABasicAnimation(keyPath: "transform.scale") //frame,bounds,transform,scale,rotation...
        
        //设置起始值,如果不设置则默认为初始化时候的值
        basicAnim.fromValue = 1
        //设置目标值
        basicAnim.toValue = 4
        //设置动画的持续时间
        basicAnim.duration = 5
        //设置动画的重复次数
        basicAnim.repeatCount = MAXFLOAT
        //设置代理(不需要遵循任何协议)
        basicAnim.delegate = self
        
        //将动画添加到layer层上
        basicLayer.addAnimation(basicAnim, forKey: nil)
 
        
        
        //关键帧动画:让视图根据设定的路线执行动画
        //创建动画
        let keyframeAnim = CAKeyframeAnimation(keyPath: "position")//位置变化
        
        //设置动画持续的时间
        keyframeAnim.duration = 7
        
        //设置组成帧动画的点
        let value1 = NSValue(CGPoint:CGPointMake(10, 10))
        let value2 = NSValue(CGPoint:CGPointMake(200, 10))
        let value3 = NSValue(CGPoint:CGPointMake(200, 400))
        let value4 = NSValue(CGPoint:CGPointMake(10, 400))
        let value5 = NSValue(CGPoint:CGPointMake(10, 10))
        
        keyframeAnim.values = [value1,value2,value5,value4,value3]
        //设置动画的重复次数
        keyframeAnim.repeatCount = MAXFLOAT
        
        keyframelayer.addAnimation(keyframeAnim, forKey: nil)
      */
        
        //动画组
        //创建放大动画
        let scaleAnim = CABasicAnimation(keyPath: "transform.scale")
        scaleAnim.fromValue = 1
        scaleAnim.toValue = 4
//        scaleAnim.duration = 5
//        scaleAnim.repeatCount = MAXFLOAT
        
        //创建旋转动画
        let rotationAnim = CABasicAnimation(keyPath: "transform.rotation.z")
        rotationAnim.toValue = 3.14 * 100
//        rotationAnim.duration = 5
//        scaleAnim.repeatCount = MAXFLOAT
        
        //创建动画组
        let groupAnim = CAAnimationGroup()
        //将基础动画添加到动画组中
        groupAnim.animations = [scaleAnim,rotationAnim]
        groupAnim.duration = 5
        groupAnim.repeatCount = MAXFLOAT
        
        grouopLayer.addAnimation(groupAnim, forKey: nil)
        
        
    }
    
    //MARK: - 基础动画的代理方法
    override func animationDidStart(anim: CAAnimation) {
        print("动画开始")
    }
    override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
        print("动画结束")
    }
    
    
    func basicAnimation() {
        basicLayer.frame = CGRectMake(200, 200, 50, 50)
        basicLayer.backgroundColor = UIColor.redColor().CGColor
        self.view.layer.addSublayer(basicLayer)
    }
    
    func keyframeAnimation() {
        keyframelayer.frame = CGRectMake(10, 10, 100, 100)
        keyframelayer.backgroundColor = UIColor.purpleColor().CGColor
        self.view.layer.addSublayer(keyframelayer)
    }
    
    func transition() {
       
        //设置图片
        photoImageView.image = UIImage(named: "a\(currentIndex).jpg")
        
    }
    
    //对同一个layer同时实现不同的动画
    func animationGroup() {
        
        grouopLayer.frame = CGRectMake(100, 200, 50, 50)
        grouopLayer.backgroundColor = UIColor.purpleColor().CGColor
        self.view.layer.addSublayer(grouopLayer)
        
    }
    
    
    //MARK: - 转场动画
    //上一张
    
    @IBAction func previousImage(sender: AnyObject) {
        
        //处理图片的索引
        if currentIndex == 0 {
            currentIndex = 12
        } else {
            currentIndex = currentIndex - 1
        }
        //重新设置图片
        photoImageView.image = UIImage(named: "a\(currentIndex).jpg")
        
        //创建转场动画
        let transition = CATransition()
        //设置动画过渡的类型
        transition.type = "pageUnCurl"//向下翻页
        //设置动画的持续时间
        transition.duration = 1.5
        
        photoImageView.layer.addAnimation(transition, forKey: nil)
        
    }
    
    //下一张
    @IBAction func nextImage(sender: AnyObject) {
        
        if  currentIndex == 12 {
            currentIndex = 0
        } else {
            currentIndex = currentIndex + 1
        }
        
        photoImageView.image = UIImage(named: "a\(currentIndex).jpg")
        
        //创建转场动画
        let transition = CATransition()
        //设置动画过渡的类型
        transition.type = "pageCurl"//向上翻页
        //设置动画的持续时间
        transition.duration = 1.5
        
        photoImageView.layer.addAnimation(transition, forKey: nil)
        
    }
    

class CustomLayer: CALayer {

    
    override func drawInContext(ctx: CGContext) {
        
       //绘制填充圆
        CGContextFillEllipseInRect(ctx, CGRectMake(0, 0, 100, 100))
        
       //设置填充颜色
        CGContextSetFillColorWithColor(ctx, UIColor.blueColor().CGColor)
        
        //开始绘制
        CGContextDrawPath(ctx, CGPathDrawingMode.Fill)
        
        
        
    }
    

  var subLayer = CustomLayer()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        //如果要使用自定义的CALayer的话,需要调用系统的drawInContext方法
        
        subLayer.frame = CGRectMake(10, 10, 200, 200)
        
        subLayer.backgroundColor = UIColor.redColor().CGColor
        
        //通过setNeedsDisplay调用系统的drawInContext方法,重新绘制layer层
        subLayer.setNeedsDisplay()
        //添加父视图的layer层上
        self.view.layer.addSublayer(subLayer)
    }
    
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        //通过事务管理添加动画
        //开启事务管理
        CATransaction.begin()
        
        //设置动画的变化属性
        subLayer.frame = CGRectMake(200, 300, 50, 50)
        
        //提交动画
        CATransaction.commit()
        
      
override func viewDidLoad() {
        super.viewDidLoad()
        
        //一般情况下,简单地动画可以直接通过UIVIew层的animation实现,如果要实现复杂动画的话,则需要使用基于layer层的coreAnimation
        
        subView.frame = CGRectMake(0, 0, 50, 50)
        subView.backgroundColor = UIColor.redColor()
        self.view.addSubview(subView)
        
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        /*
        //方式一:通过UIKit形式实现
        //开始动画
        UIView.beginAnimations("anim", context: nil)
        
        //设置需要改变的属性
        subView.frame = CGRectMake(200, 200, 100, 200)
        //设置动画持续的时间
        UIView.setAnimationDuration(7)
        
        //提交动画
        UIView.commitAnimations()
 
        
        //方式二:通过代码块的形式实现动画
        //方法一:
        UIView.animateWithDuration(3) { 
           self.subView.frame = CGRectMake(200, 200, 100, 200)
        }
 
 
        
        //方法二:可以使用嵌套的方式实现复杂的动画
        UIView.animateWithDuration(5, animations: { 
            
            //设置需要改变的属性
            self.subView.frame = CGRectMake(200, 200, 100, 200)
            
            }) { (isFinished) in
                //动画执行完成之后需要执行的操作
              print("动画完成了")
                
            UIView.animateWithDuration(5, animations: {
                
                self.subView.frame = CGRectMake(200, 400, 100, 100)
                
                }, completion: nil)
                
                
        }
        
        */
        
        
        //方法三:
        /*
         para1:动画持续的时间
         para2:动画开始之前的延时时间
         para3:额外的操作,可以设置动画显示的形式
         para4:设置需要改变的属性
         para5:动画完成之后需要执行的操作
         */
        UIView.animateWithDuration(5, delay: 10, options: [.CurveEaseIn,.CurveEaseOut,.CurveEaseInOut], animations: { 
            
            
            self.subView.frame = CGRectMake(200, 200, 100, 200)
            
            }, completion: nil)
        
        
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容