как сделать динамический strokeColor в CAShapeLayer? В Swift

Я использую шесть параметров (активных, неактивных, проводных, сжатых, свободных и тотальных). Я делаю класс CAShapeLayer и я сделал одну функцию там, с помощью которой я могу рисовать круг, просто добавляя параметры. Я делаю CGPath и добавляю его шесть раз в функцию, которые рисуют круг. Я получаю 5 слоев в UIView . Я делаю таймер, который обновляет данные за одну секунду, но добавляет еще 5 слоев в UIView . Это неправильно. Я хочу анимацию дуг с данными и обновление за одну секунду. когда слои становятся слишком большим, устройство работает медленно. Как я могу это сделать?

Я написал здесь свой пример.

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

}

введите описание изображения здесь

One Solution collect form web for “как сделать динамический strokeColor в CAShapeLayer? В Swift”

Я изменил код, и он работает для меня.

 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)") } 
  • UIView: разница производительности / памяти между альфа: 0, скрытая: YES, removeViewFromSuperview и frame.origin.y = -100000;
  • Обнаружение авторотации внутри подкласса UIView
  • Как исправить ошибку «nib но не получить UITableView»?
  • Как использовать xib-файл как пользовательский вид в раскадровке
  • добавление ограничения в подвью делает фоновый цвет не отображен
  • Интервал CATransform3D по краю обзора, который вращается
  • Как заставить UIButton всегда быть на высоте
  • Как показать UIView только тогда, когда я получил все данные с сервера
  • Только верхний левый угол округляется вместо topLeft и bottomLeft
  • SpringWithDamping для анимаций CALayer?
  • Прокрутка Uiview с веб-просмотром
  • Interesting Posts

    drawRect над областями?

    MQTT по реагенту?

    Pinterest SDK для Monotouch – сбой CreatePinWithImageURL

    AVPlayer статус один раз AVPlayerItemStatusFailed, а затем всегда сбой – Как очистить AVPlayer полностью после получения статуса AVPlayerItemStatusFailed?

    Можно ли полагаться на NSUbiquitousKeyValueStore для хранения важных данных?

    Рассчитать ETA в Свифте

    iOS – быстрая слияния видео с использованием AVFoundation

    ObjC – Как явно передать права собственности блоку, который будет выполняться асинхронно?

    Ошибка приложения при использовании NSIndexPath в iOS5

    Проверьте, существует ли URL-адрес

    Каков наилучший способ сопоставления шаблонов URL-адресов REST с объектами модели для структуры Siesta?

    viewWithTag возвращает nil при инициализации UICollectionViewCell

    Objective-c: Вопросы о self =

    Функция «Не беспокоить» в iOS 6 Как реализовать?

    Ошибка кодового знака при создании с использованием jenkins xcode build plugin

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.