使用Swift和Core Graphics在iOS上快速绘制线条

时间:2014-07-28 15:45:15

标签: ios swift core-graphics

我需要在iOS上绘制折线图,​​并认为Core Graphics是表现最佳的候选者。

对于这个自定义图表控件,我创建了一个UIView的子类,其中包含一个名为drawChart的方法,该方法在滑块的值更改时调用,或者在数据更改时调用,因此非常频繁。

在此方法中是一个循环,用于计算每个数据集的x和y位置;

lines = [];
for var i:Int = startX; i < endX; ++i {    
    lines.append(LinePoint(x: xDC!, y: yDC!));
}

“lines”是一个行数组,Line是一个模型类,用于存储线段x和y值(CGPoint)。

最终,drawChart函数调用self.setNeedsDisplay();

然后我覆盖了如下所示的drawRect;

override func drawRect(rect: CGRect)  {

    if(lines.count == 0) {
            return
    }

    var context = UIGraphicsGetCurrentContext();

    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, 1);
    CGContextSetStrokeColorWithColor(context, UIColor.blackColor().CGColor);
    CGContextBeginPath(context);

    var firstLine:LinePoint = lines[0]
    CGContextMoveToPoint(context, firstLine.x, firstLine.y);

    for var i:Int = 1; i<lines.count;++i {
        var loopLine:LinePoint = lines[i]    
        CGContextAddLineToPoint(context, loopLine.x, loopLine.y);
    }

    CGContextStrokePath(context);

}

简而言之,这很慢,因为地狱,特别是向阵列附加线路的速度很快。

理想情况下,我想避免将线点缓存到数组并直接绘制它们,但是我无法获得drawChart方法的正确上下文(CGContextSetLineCap:无效上下文0x0),这就是为什么我认为它需要在drawRect方法中。

我怎样才能加快速度?任何帮助将非常感谢!

0 个答案:

没有答案