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, 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, 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, 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)
        
        
    }

你可能感兴趣的:(CALayer相关)