iOS使用CGContext绘制线条的质量比SpriteKit中的SKShapeNode差

时间:2016-06-23 02:01:33

标签: ios swift uiview sprite-kit cgcontext

我正在制作一个用户可以用手指画线的游戏。网站上有很多方法。我尝试了两种方法,一种在UIView(UIKit)中使用CGContext,另一种在SpriteKit中使用CGPath和SKShapeNode。但后者显示出更好的质量。使用CGContext的第一个具有难看的粗糙边缘。

请参阅以下屏幕截图。我还在这里附加了这两种方法的部分代码,(在touchesMove函数中)。

注意:var ref = CGPathCreateMutable()

UIView中的CGContext enter image description here

    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 enter image description here 注意: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绘制线条?

1 个答案:

答案 0 :(得分:1)

一个明显的问题是你使用的是一个不能处理Retina屏幕的过时功能:

UIGraphicsBeginImageContext(self.frame.size)

您应该使用此代码:

UIGraphicsBeginImageContextWithOptions(self.frame.size, false, 0)

{0}作为最终参数的WithOptions版本,如果设备具有Retina屏幕,则在Retina分辨率下创建图像上下文。 (0参数表示“使用设备屏幕的比例因子”。)

可能还有其他问题,因为您没有显示在每个测试用例的路径中创建点的代码。