如何使CAShapeLayer中的dynamicstrokeColor? 在Swift中

我使用六个参数(活动,不活动,有线,压缩,免费和总计)。 我做了一个CAShapeLayer类,我在那里做了一个function,我可以绘制圆只是添加参数的帮助。 我制作了CGPath并且在绘制一个圆圈的函数中添加了六次。 我得到了5层到UIView 。 我做了一秒钟更新数据的定时器,但它添加其他5层到UIView 。 这是错误的方式。 我想用数据animation弧,并在一秒钟内更新。 当层变得太多设备工作缓慢。 我怎样才能做到这一点?

我在这里写了我的例子。

 public class Arc { public init() { } public func addFigure(path: CGPath, fillColor: UIColor, strokeColor: UIColor, strokeStart: CGFloat, strokeEnd: CGFloat, lineWidth: CGFloat, miterLimit: CGFloat, lineDashPhase: CGFloat, layer: CALayer) -> CAShapeLayer { let shape = CAShapeLayer() shape.path = path shape.fillColor = fillColor.CGColor shape.strokeColor = strokeColor.CGColor shape.strokeStart = strokeStart shape.strokeEnd = strokeEnd shape.lineWidth = lineWidth shape.miterLimit = miterLimit shape.lineDashPhase = lineDashPhase return shape } } 

UIView是绘制圈子

  import UIKit import DrawKit class MemoryMainView: UIView { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override init(frame: CGRect) { super.init(frame: frame) } // MARK: - var and let let arc = Arc() let notificationCenter = NSNotificationCenter.defaultCenter() var boolForMemoryArc = false // for ARC var memoryArcRadius: CGFloat! var lineWidht: CGFloat! var path: UIBezierPath! var checkDevice = false // MARK: - colors @IBInspectable var blackColor: UIColor = .blackColor() @IBInspectable var redColor: UIColor = .redColor() @IBInspectable var cyanColor: UIColor = .cyanColor() @IBInspectable var blueColor: UIColor = .blueColor() @IBInspectable var grapeColor: UIColor! @IBInspectable var greenColor: UIColor = .greenColor() override func drawRect(rect: CGRect) { if boolForMemoryArc == false { drawMemoryArc() boolForMemoryArc = true } notificationCenter.addObserver(self, selector: "turnOnMemoryTimer", name: "turnOnMemoryArc", object: nil) } func drawMemoryArc() { if checkDevice == false { let device = CheckDevice().returnResult() memoryArcRadius = device.radiusArc lineWidht = device.lineWidth path = UIBezierPath(arcCenter: CGPoint(x: frame.size.width/2, y: frame.size.height/2), radius: memoryArcRadius, startAngle: CGFloat(-M_PI_2), endAngle: CGFloat(M_PI*2 - M_PI_2), clockwise: true) checkDevice = true } let memory = showMemory() // active cyanColor arc.addFigure(path.CGPath, fillColor: blackColor, strokeColor: cyanColor, strokeStart: 0.0, strokeEnd: CGFloat(percentageMemory(memory.active)), lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) // inactive blue arc.addFigure(path.CGPath, fillColor: .clearColor(), strokeColor: blueColor, strokeStart: CGFloat(percentageMemory(memory.active)), strokeEnd: CGFloat(percentageMemory(memory.active + memory.inactive)), lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) // wired redColor arc.addFigure(path.CGPath, fillColor: .clearColor(), strokeColor: redColor, strokeStart: CGFloat(percentageMemory(memory.active + memory.inactive)), strokeEnd: CGFloat(percentageMemory(memory.active + memory.inactive + memory.wired)), lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) // compressed yellow arc.addFigure(path.CGPath, fillColor: .clearColor(), strokeColor: grapeColor, strokeStart: CGFloat(percentageMemory(memory.active + memory.inactive + memory.wired)), strokeEnd: CGFloat(percentageMemory(memory.active + memory.inactive + memory.wired + memory.compressed)), lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) // free green arc.addFigure(path.CGPath, fillColor: .clearColor(), strokeColor: greenColor, strokeStart: CGFloat(percentageMemory(memory.active + memory.inactive + memory.wired + memory.compressed)), strokeEnd: 1.0, lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) print("memory layers \(self.layer.sublayers?.count)") } func turnOnMemoryTimer() { GlobalTimer.sharedInstance.viewTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawMemoryArc", userInfo: nil, repeats: true) } 

}

在这里输入图像说明

我改变了代码,它适用于我。

 func drawMemoryArc() { if checkDevice == false { let device = CheckDevice().returnResult() memoryArcRadius = device.radiusArc lineWidht = device.lineWidth path = UIBezierPath(arcCenter: CGPoint(x: frame.size.width/2, y: frame.size.height/2), radius: memoryArcRadius, startAngle: CGFloat(-M_PI_2), endAngle: CGFloat(M_PI*2 - M_PI_2), clockwise: true) checkDevice = true } let memory = showMemory() layer.sublayers?.removeAll() // active cyanColor arc.addFigure(path.CGPath, fillColor: blackColor, strokeColor: cyanColor, strokeStart: 0.0, strokeEnd: CGFloat(percentageMemory(memory.active)), lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) // inactive blue arc.addFigure(path.CGPath, fillColor: .clearColor(), strokeColor: blueColor, strokeStart: CGFloat(percentageMemory(memory.active)), strokeEnd: CGFloat(percentageMemory(memory.active + memory.inactive)), lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) // wired redColor arc.addFigure(path.CGPath, fillColor: .clearColor(), strokeColor: redColor, strokeStart: CGFloat(percentageMemory(memory.active + memory.inactive)), strokeEnd: CGFloat(percentageMemory(memory.active + memory.inactive + memory.wired)), lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) // compressed yellow arc.addFigure(path.CGPath, fillColor: .clearColor(), strokeColor: grapeColor, strokeStart: CGFloat(percentageMemory(memory.active + memory.inactive + memory.wired)), strokeEnd: CGFloat(percentageMemory(memory.active + memory.inactive + memory.wired + memory.compressed)), lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) // free green arc.addFigure(path.CGPath, fillColor: .clearColor(), strokeColor: greenColor, strokeStart: CGFloat(percentageMemory(memory.active + memory.inactive + memory.wired + memory.compressed)), strokeEnd: 1.0, lineWidth: lineWidht, miterLimit: 0.0, lineDashPhase: 0.0, layer: self.layer) print("memory layers \(self.layer.sublayers?.count)") }