2016-07-07 4 views
0

Я создал собственный класс, который создает своего рода график времени, который предназначен для прокрутки по горизонтали. Вот код для моего обычая UIScrollView:Мой код CoreGraphics работает очень медленно. Как я могу сделать этот пользовательский UIScrollView более эффективным?

import UIKit 

struct DataPoint { 
    var fillColor: UIColor = UIColor.grayColor() 

    init(color: UIColor) { 
     fillColor = color 
    } 
} 

@IBDesignable 
class MyView: UIScrollView { 

    @IBInspectable var lineColor: UIColor = UIColor.grayColor() 
    @IBInspectable var lineHeight: CGFloat = 65 
    @IBInspectable var lineWidth: CGFloat = 15 
    @IBInspectable var lineGap: CGFloat = 25 
    @IBInspectable var lineCount: Int = 0 

    var dataPoints = [DataPoint(color: UIColor.greenColor()), DataPoint(color: UIColor.blueColor())] 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setupValues() 

    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setupValues() 
     //fatalError("init(coder:) has not been implemented") 
    } 

    func setupValues() { 

     self.contentSize = CGSize(width: self.frame.width * 2, height: self.frame.height) 

     self.backgroundColor = UIColor.whiteColor() 
     self.lineCount = Int(self.frame.width/lineGap) 
    } 

    override internal func layoutSubviews() { 
     super.layoutSubviews() 
     self.setNeedsDisplay() 
     self.layoutIfNeeded() 
    } 

    override func drawRect(rect: CGRect) { 

     let ctx = UIGraphicsGetCurrentContext() 
     CGContextSaveGState(ctx) 

     for i in 0...lineCount { 

      let start = CGPoint(x: CGFloat(i) * lineGap, y: self.frame.height) 
      let end = CGPoint(x: CGFloat(i) * lineGap, y: self.frame.height - lineHeight) 

      drawLine(from: start, to: end, color: UIColor.grayColor()) 

      if i % (lineCount/(dataPoints.count + 2)) == 0 && i != 0 && i != lineCount { 
       drawPoint(at: end, radius: 5, color: UIColor.orangeColor()) 
      } 
     } 

     CGContextRestoreGState(ctx) 
    } 

    func drawLine(from start: CGPoint, to end: CGPoint, color: UIColor) { 

     let path = UIBezierPath() 
     path.moveToPoint(start) 
     path.addLineToPoint(end) 

     let shapeLayer = CAShapeLayer() 
     shapeLayer.path = path.CGPath 
     shapeLayer.strokeColor = color.CGColor 
     shapeLayer.lineWidth = 1 

     self.layer.addSublayer(shapeLayer) 
    } 

    func drawPoint(at center: CGPoint, radius: CGFloat, color: UIColor) { 

     let path = UIBezierPath(arcCenter: center, radius: radius, startAngle: CGFloat(0), endAngle: CGFloat(M_PI * 2), clockwise: true) 

     let shapeLayer = CAShapeLayer() 
     shapeLayer.path = path.CGPath 
     shapeLayer.fillColor = color.CGColor 
     shapeLayer.strokeColor = UIColor.blackColor().CGColor 
     shapeLayer.lineWidth = 0.5 

     self.layer.addSublayer(shapeLayer) 
    } 
} 

На моем устройстве и на тренажерах, это крайне медленно и лага. Что именно я делаю неправильно здесь? И какие шаги я могу предпринять для достижения прочного 60fps при прокрутке?

ответ

1

Здравствуйте, я нашел вашу проблему, ваша проблема

override internal func layoutSubviews() { 
    super.layoutSubviews() 
    self.setNeedsDisplay() 
    self.layoutIfNeeded() 
} 

вы случайно в нескончаемом цикле краски

заменить это этим

override internal func layoutSubviews() { 
    super.layoutSubviews() 
} 

или удалить вообще

Надеюсь, это поможет вам, для меня отлично работает

0

Мне кажется, что вы рисуете одно и то же каждый раз. Все статично ... Итак, почему бы не сделать все это один раз в графическом контексте и сделать из него UIImage, чтобы добавить на задний план scrollview (или на передний план, в зависимости от того, что вы делаете)?

+0

Я хочу добавить анимацию и изменить масштаб позже. Вот почему я не выбрал изображение. –

+0

В этом случае я бы сделал каждую строку и каждую точку UIView. Затем добавьте их в scrollview. Тогда анимация и масштабирование изменений будут очень простыми, и вы не будете перерисовывать каждый свиток. – Putz1103

 Смежные вопросы

  • Нет связанных вопросов^_^