Swift:使用SKCropNode创建四分之一圈不起作用

时间:2018-07-08 23:48:49

标签: swift sprite-kit uibezierpath

下面的代码无法生成四分之一圈。但是,如果将端角更改为.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(图片为白色,因此请点击以下下载):

Dot.png below (white circle so click on space below)

1 个答案:

答案 0 :(得分:3)

问题在于您仅绘制圆弧,UIBezierPath通过在起点处绘制一条线来封闭路径。绘制半圆时,这是可行的,因为绘制的线是圆的直径。

在四分之一圆的情况下,您最终会得到一个将两个端点相连的和弦,但这并不能给您理想的结果。

要解决此问题,请在绘制圆弧后在圆(0, 0)的中心画一条线。然后,当路径闭合时,它将把另一个半径拉回到圆弧的起点。

新的bezier路径代码:

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))