代码之家  ›  专栏  ›  技术社区  ›  Crashalot

swift:创建四分之一圆,skcropnode不工作

  •  1
  • Crashalot  · 技术社区  · 6 年前

    下面的代码无法生成四分之一圆。但是,如果将结束角度更改为.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 回复  |  直到 6 年前
        1
  •  3
  •   vacawama    6 年前

    问题是你只是在画弧线, 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))