我正在制作一个用户可以用手指画线的游戏。网站上有很多方法。我尝试了两种方法,一种在UIView(UIKit)中使用CGContext,另一种在SpriteKit中使用CGPath和SKShapeNode。但后者显示出更好的质量。使用CGContext的第一个具有难看的粗糙边缘。
请参阅以下屏幕截图。我还在这里附加了这两种方法的部分代码,(在touchesMove
函数中)。
注意:var ref = CGPathCreateMutable()
CGPathAddLineToPoint(ref, nil, currentPoint.x, currentPoint.y)
UIGraphicsBeginImageContext(self.frame.size)
let context = UIGraphicsGetCurrentContext()
tempImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height))
CGContextAddPath(context, ref)
// 3
CGContextSetLineCap(context, CGLineCap.Round)
CGContextSetLineWidth(context, brushWidth)
CGContextSetRGBStrokeColor(context, red, green, blue, 1.0)
CGContextSetBlendMode(context, CGBlendMode.Normal)
// 4
CGContextStrokePath(context)
// 5
UIGraphicsEndImageContext()
SpriteKit中的SKShapeNode
注意:var lineDrawing = SKShapeNode()
CGPathAddLineToPoint(ref, nil, location.x, location.y)
lineDrawing.path = ref
lineDrawing.lineWidth = 3
lineDrawing.strokeColor = UIColor.blackColor()
lineDrawing.alpha = 1.0
self.addChild(lineDrawing)
如何在UIView中使用相同质量的SKShapeNode绘制线条?
答案 0 :(得分:1)
一个明显的问题是你使用的是一个不能处理Retina屏幕的过时功能:
UIGraphicsBeginImageContext(self.frame.size)
您应该使用此代码:
UIGraphicsBeginImageContextWithOptions(self.frame.size, false, 0)
{0}作为最终参数的WithOptions
版本,如果设备具有Retina屏幕,则在Retina分辨率下创建图像上下文。 (0参数表示“使用设备屏幕的比例因子”。)
可能还有其他问题,因为您没有显示在每个测试用例的路径中创建点的代码。