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