Swift:使用 SKCropNode 创建四分之一圆不起作用
Swift: creating quarter circle with SKCropNode not working
下面的代码无法生成四分之一圆。但是,如果将结束角度更改为 .pi,代码会按预期生成一个半圆。
为什么四分之一圈失败?
// Create circle
let circleSize = CGSize(width: width, height: width)
let circle = SKSpriteNode(texture: SKTexture(imageNamed: "Dot.png"), color: color, size: circleSize)
circle.colorBlendFactor = 1.0
// Add circle to crop node
let cropNode = SKCropNode()
cropNode.addChild(circle)
// Set crop node mask
let bezierPath = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0), radius: width/2, startAngle: 0, endAngle: .pi/2, clockwise: true)
let maskNode = SKShapeNode(path: bezierPath.cgPath)
maskNode.isAntialiased = false
maskNode.lineWidth = 0
maskNode.fillColor = color
cropNode.maskNode = maskNode
Dot.png(图片为白色点击下方下载):
问题是您只画了圆弧,UIBezierPath
通过画一条线回到起点来关闭路径。当你画一个半圆时,这是有效的,因为画的线是圆的直径。
在四分之一圆的情况下,您最终会得到一个连接两个端点的弦,但这不会给您想要的结果。
要解决此问题,请在绘制圆弧后在圆心画一条线 (0, 0)
。然后当路径闭合时,它会把另一个半径拉回圆弧的起点。
新 bezierPath 代码:
let bezierPath = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0), radius: width/2, startAngle: 0, endAngle: .pi/2, clockwise: true)
bezierPath.addLine(to: CGPoint(x: 0, y: 0))
下面的代码无法生成四分之一圆。但是,如果将结束角度更改为 .pi,代码会按预期生成一个半圆。
为什么四分之一圈失败?
// Create circle
let circleSize = CGSize(width: width, height: width)
let circle = SKSpriteNode(texture: SKTexture(imageNamed: "Dot.png"), color: color, size: circleSize)
circle.colorBlendFactor = 1.0
// Add circle to crop node
let cropNode = SKCropNode()
cropNode.addChild(circle)
// Set crop node mask
let bezierPath = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0), radius: width/2, startAngle: 0, endAngle: .pi/2, clockwise: true)
let maskNode = SKShapeNode(path: bezierPath.cgPath)
maskNode.isAntialiased = false
maskNode.lineWidth = 0
maskNode.fillColor = color
cropNode.maskNode = maskNode
Dot.png(图片为白色点击下方下载):
问题是您只画了圆弧,UIBezierPath
通过画一条线回到起点来关闭路径。当你画一个半圆时,这是有效的,因为画的线是圆的直径。
在四分之一圆的情况下,您最终会得到一个连接两个端点的弦,但这不会给您想要的结果。
要解决此问题,请在绘制圆弧后在圆心画一条线 (0, 0)
。然后当路径闭合时,它会把另一个半径拉回圆弧的起点。
新 bezierPath 代码:
let bezierPath = UIBezierPath(arcCenter: CGPoint(x: 0, y: 0), radius: width/2, startAngle: 0, endAngle: .pi/2, clockwise: true)
bezierPath.addLine(to: CGPoint(x: 0, y: 0))