图层(CALayer)的基本使用

//
//  ViewController.swift
//  图层_layer基本使用
//
//  Created by admin on 16/1/27.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    weak var childLayer:CALayer!
    override func viewDidLoad() {
        super.viewDidLoad()
        // 设置圆角的同时设置阴影,需要先将图片切成圆角,再设置阴影
        // self.imageView.layer.contents = self.corrnerImage().CGImage
        // self.transform(self.imageView.layer)
        // self.position()
        self.animation()
    }
    // 隐式动画,注意根层layer是没有隐式动画的
    func animation()
    {
        self.imageView.layer.contents = self.corrnerImage().CGImage
        let layer = CALayer()
        layer.frame = CGRectMake(100, 100, 100, 100)
        layer.contents = self.corrnerImage().CGImage
        self.imageView.layer.addSublayer(layer)
        // 给变量属性,方便之后使用
        self.childLayer = layer
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        CATransaction.begin()
        // 关闭子层的动画
//        CATransaction.setDisableActions(true)
        // 设置动画执行的时间
        CATransaction.setAnimationDuration(10)
        self.imageView.layer.transform = CATransform3DMakeScale(1.5, 1.5, 1.5)
        self.childLayer.transform = CATransform3DMakeScale(1.5, 1.5, 1.5)
        CATransaction.commit()
    }
    // 使用自定义layer
    func layer()
    {
        let layer = ViewController.MyLayer()
        layer.frame = CGRectMake(0, 0, 100, 100)
        self.view.layer.addSublayer(layer)
        // 和自定义view不同的是,自定义layer要显示,需要调用下 setNeedsDisplay 方法
        layer.setNeedsDisplay()
    }
    // 自定义layer
    class MyLayer: CALayer {
        // 渲染 layer 内容
        override func drawInContext(ctx: CGContext) {
            CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100))
            UIColor.redColor().set()
            CGContextFillPath(ctx)
        }
    }
    // position 和 anchorPoint
    func position()
    {
        let layer = CALayer()
        layer.frame = CGRectMake(0, 0, 100, 100)
        layer.backgroundColor = UIColor.blackColor().CGColor
        // 设置位置,这里的位置其实是设置锚点的坐标
        layer.position = CGPoint(x: 100, y: 100)
        // 设置锚点
        layer.anchorPoint = CGPoint(x: 0, y: 1)

        self.view.layer.addSublayer(layer)
    }
    // layer的形变属性
    func transform(layer:CALayer)
    {
        // 因为这里和之前的view的transform不一样,需要理解3d是什么样的,3d的有三个方向(正方体的一个角的三条棱可以作为参照),所以有三个坐标值,分别对应(x,y,z)
        // 平移,3d的有三个方向,所以有三个值,分别对应(x,y,z),注意这里最后一个是无效的
        layer.transform = CATransform3DMakeTranslation(10, 20, 0)
        // 缩放,最后一个属性无效
        layer.transform = CATransform3DMakeScale(1, 0.5, 10)
        // 旋转,参数分别对应(角度,x轴是否旋转,y轴是否旋转,z轴是否旋转)
        layer.transform = CATransform3DMakeRotation(CGFloat(M_PI * 0.3), 1, 1, 1)

        // kvc方式赋值,注意这里需要用 NSValue 转换下
        layer.setValue(NSValue.init(CATransform3D: CATransform3DMakeScale(1.5, 1, 0)), forKey: "transform")
        // kvc forKeyPath方式
        layer.setValue(1.1, forKeyPath: "transform.scale.x")
        // 不具体指定某个值
        layer.setValue(NSValue.init(CGPoint: CGPoint(x: 100, y: 10)), forKeyPath: "transform.translation")
    }
    // 获得圆角带边框图片
    func corrnerImage()->UIImage
    {
        let image = UIImage(imageLiteral: "3")
        UIGraphicsBeginImageContextWithOptions(image.size, false, 0)
        let layer = CALayer()
        layer.bounds = CGRectMake(0, 0, image.size.width, image.size.width)
        layer.contents = image.CGImage
        layer.cornerRadius = 10
        layer.masksToBounds = true
        layer.borderColor = UIColor.whiteColor().CGColor
        layer.borderWidth = 5
        layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let resImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return resImage
    }
    // 图层常用属性
    func layerAttr()
    {
        //        self.imageView.image = UIImage(imageLiteral: "2")
        // 使用了auto layout下面的设置是无效的
        self.imageView.layer.frame = CGRectMake(self.imageView.frame.origin.x, self.imageView.frame.origin.y, 300, 200)
        self.imageView.layer.bounds = CGRectMake(0, 0, 300, 200)
        // 圆角,两个属性一起使用才有效
        self.imageView.layer.cornerRadius = 10
        //        self.imageView.layer.masksToBounds = true
        // 设置图层背景颜色
        //        self.imageView.layer.backgroundColor = UIColor.redColor().CGColor
        // 设置layer背景,一般是个图片,
        self.imageView.layer.contents = UIImage(imageLiteral: "2").CGImage
        // 设置阴影,注意color和opacity要同时使用才能看到阴影,再就是,如果使用了剪切的话,阴影设置是无效的
        self.imageView.layer.shadowColor = UIColor.blackColor().CGColor
        // 阴影起始位置相对于原view的位置
        self.imageView.layer.shadowOffset = CGSize(width: 10, height: 10)
        // 阴影的透明度,默认是完全透明的
        self.imageView.layer.shadowOpacity = 0.5
        // 阴影的圆角
        self.imageView.layer.shadowRadius = 10
        // 边框,注意两个属性要配合使用才有效
        self.imageView.layer.borderColor = UIColor.whiteColor().CGColor
        self.imageView.layer.borderWidth = 5
    }
}

标签: swift, CALayer, 图层

添加新评论