CALayer 属性动画
新建layer 集成自CALayer 并定义属性 通过修改属性进行动画的执行
这一块比较简单就直接上代码了
DMEO效果
//
// DSProgressLayer.swift
// AnimationStd
//
// Created by 鲍东升 on 16/5/20.
// Copyright © 2016年 鲍东升. All rights reserved.
//
import UIKit
class DSProgressLayer: CAShapeLayer {
//MARK: - PropertyList
var progress:CGFloat = 0
var i_progress:CGFloat{
set{
self.progress = newValue
self.setAnimatiion(self.progress, layer: self.pointerLayer)
}
get{
return self.progress
}
}
private lazy var pointerLayer:CAShapeLayer={
var val=CAShapeLayer()
return val
}()
//MARK: - Func
override init() {
super.init()
self.prepareLayer(self,pointerLayer: pointerLayer)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//MARK: - CustomFunc
func prepareLayer(layer:CAShapeLayer,pointerLayer:CAShapeLayer) -> CAShapeLayer {
layer.bounds = CGRect(x: 0, y: 0, width: 200, height: 200)
layer.path = UIBezierPath(ovalInRect: layer.bounds).CGPath
layer.fillColor = UIColor.clearColor().CGColor
layer.strokeColor = UIColor.orangeColor().CGColor
layer.lineWidth = 4
pointerLayer.path = UIBezierPath(rect: CGRectMake(-2, -97,4, 97)).CGPath
pointerLayer.fillColor = UIColor.cyanColor().CGColor
pointerLayer.position = CGPoint(x: layer.bounds.size.width/2, y: layer.bounds.size.width/2)
layer.addSublayer(pointerLayer)
return layer
}
func setAnimatiion(progress:CGFloat,layer:CAShapeLayer) -> CAShapeLayer {
layer.setAffineTransform(CGAffineTransformMakeRotation(progress * 2.0 * CGFloat(M_PI)))
return layer
}
}
//
// ViewController.swift
// LayerAnimation
//
// Created by 鲍东升 on 16/5/20.
// Copyright © 2016年 鲍东升. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
//MARK: - PropertyList
var sliderValueChangeBlock:((slider:UISlider)->())?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
prepareView(view)
}
func prepareView(view:UIView) -> UIView {
configLayer(view,layer:DSProgressLayer(),done:
{
(layer:DSProgressLayer)->()
in
self.configSlider(
UISlider(frame: CGRect(x: layer.frame.origin.x, y: 420, width: layer.frame.width, height: 20)),
layer: layer,done: {
(slider:UISlider)->()
in
view.addSubview(slider)
})
}
)
return view
}
func configLayer(view:UIView,layer:DSProgressLayer,done:((layer:DSProgressLayer)->()) ){
view.layer.addSublayer(layer)
layer.frame = CGRect(x: UIScreen.mainScreen().bounds.width/2 - 100, y: 200, width: 200, height: 200)
done(layer: layer)
}
func configSlider(slider:UISlider,layer:DSProgressLayer,done:(slider:UISlider)->()){
slider.addTarget(self, action: #selector(self.actionSliderValueChange(_:)), forControlEvents: UIControlEvents.ValueChanged)
sliderValueChangeBlock = {
(slider:UISlider)->()
in
layer.i_progress = CGFloat(slider.value)
}
func impSliderValueChange(slider:UISlider){
layer.i_progress = CGFloat(slider.value)
}
done(slider: slider)
}
func actionSliderValueChange(slider:UISlider){
if (sliderValueChangeBlock != nil) {
sliderValueChangeBlock!(slider: slider)
}
}
}