在CGImage上绘制线条

时间:2016-10-05 13:09:52

标签: ios swift core-graphics

我目前正在尝试开发绘图应用。我遇到的问题是优化应用程序的性能。

我已经将UIView子类化,我正在检测用户的输入。

起初我尝试用draw(_ rect: CGRect)方法绘制CoreGraphics的所有行,但当行数为10 000+时,滞后非常明显。那么我想创建一个CGImage,我将在每个draw(...)周期之后制作,然后当下一个绘制周期到来时,我会将新线放在CGImage的顶部,因此不会再次绘制所有前一行节省宝贵的时间。

我正在touchesBegan()touchesMoved()方法中注册新行,然后我正在调用self.needsDisplay()

这是我目前使用的代码:

var mainImage: CGImage?
var newLines: [Line]

override func draw(_ rect: CGRect) {

    let context = UIGraphicsGetCurrentContext()

    //context?.translateBy(x: 0, y: bounds.height)
    //context?.scaleBy(x: 1, y: -1)

    if let image = mainImage {
        context?.draw(image, in: bounds)
    }

    for line in newLines {
        context?.setStrokeColor(UIColor.black.cgColor)
        context?.setLineWidth(1)

        context?.move(to: line.previousLocation)
        context?.addLine(to: line.location)

        context?.strokePath()
    }
    newLines = []

    mainImage = context?.makeImage()
}

现在问题在于我绘制的线条分为两部分并垂直镜像。 (Image split vertically)。我在这里绘制了两条连续的线 - 一条直线和一条曲线。奇怪的是,如果我翻转UIView的一半,这些线将连续对齐,它们之间没有空格。

如果我取消注释前面提到的代码(context?.translateBy(x: 0, y: bounds.height)context?.scaleBy(x: 1, y: -1))中的两行,image would look like this

现在唯一的错误就是我在屏幕的下方画画并在上面画了结果。

我该如何纠正?什么是我的问题的正确解决方案?

非常感谢!

1 个答案:

答案 0 :(得分:0)

当您注释掉这两行时,您不会对图形上下文进行任何更改。如果您取消注释,那么您将在每次调用时更改上下文而不保存它。所以我认为你每次都在翻转它。不确定是不是这样,但你绝对应该在绘图之前推送/保存你的上下文(显然还原/弹出它)。

查看此帖子:using UIImage drawInRect still renders it upside down.