我目前正在尝试开发绘图应用。我遇到的问题是优化应用程序的性能。
我已经将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。
现在唯一的错误就是我在屏幕的下方画画并在上面画了结果。
我该如何纠正?什么是我的问题的正确解决方案?
非常感谢!
答案 0 :(得分:0)
当您注释掉这两行时,您不会对图形上下文进行任何更改。如果您取消注释,那么您将在每次调用时更改上下文而不保存它。所以我认为你每次都在翻转它。不确定是不是这样,但你绝对应该在绘图之前推送/保存你的上下文(显然还原/弹出它)。
查看此帖子:using UIImage drawInRect still renders it upside down.