iOS the quality of drawing lines using CGContext is much worse than SKShapeNode in SpriteKit
我正在制作一个用户可以用手指画线的游戏。网站上有很多方法。我尝试了两种方法,一种在 UIView (UIKit) 中使用 CGContext,另一种在 SpriteKit 中使用 CGPath 和 SKShapeNode。但后者显示出更好的质量。第一个使用 CGContext 有丑陋的粗糙边缘。
请查看以下屏幕截图。我还在此处附上了这两种方法的部分代码(在
注意:
UIView 中的CGContext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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
注意:
1 2 3 4 5 6 | 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 相同质量的线条?
一个明显的问题是您正在使用一个不能处理 Retina 屏幕的过时函数:
1 | UIGraphicsBeginImageContext(self.frame.size) |
你应该改用这个:
1 | UIGraphicsBeginImageContextWithOptions(self.frame.size, false, 0) |
可能还有其他问题,因为您没有显示为每个测试用例在路径中创建点的代码。