画一个部分圆圈

时间:2015-02-13 00:14:09

标签: swift uibezierpath

我正在编写一个程序,该程序将采用0到1之间的数字,然后吐出一个圆圈(或者我想是圆弧),这个圆圈就完成了。

因此,例如,如果输入0.5,程序将输出半圆

如果为0.1,程序将输出一个微小的弧,最终将占整个圆的10%。

我可以通过使角度起点0和角度终点2*M_PI*decimalInput

来实现这一点

但是,我需要在圆圈顶部设置起点,因此起点为3*M_PI_2,结束点为7*M_PI_2

我在使用这些新的起点/终点绘制一个部分完成的圆圈时遇到了麻烦。而且我承认,我的数学不是最好的,所以任何建议/意见都值得赞赏

这是我到目前为止所拥有的

var decimalInput = 0.75 //this number can be any number between 0 and 1
let start = CGFloat(3*M_PI_2)
let end = CGFloat(7*M_PI_2*decimalInput)

let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: start, endAngle: end, clockwise: true)

circlePath.stroke()

尽管我尝试了,但我似乎无法做到正确。我认为结束角度是罪魁祸首,除非我以错误的方式解决这个问题

2 个答案:

答案 0 :(得分:4)

弧长为2 * M_PI * decimalInput。您需要将弧长添加到起始角度,如下所示:

let circleCenter = CGPointMake(100, 100)
let circleRadius = CGFloat(80)
var decimalInput = 0.75
let start = CGFloat(3 * M_PI_2)
let end = start + CGFloat(2 * M_PI * decimalInput)
let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: start, endAngle: end, clockwise: true)
XCPCaptureValue("path", circlePath)

结果:

arc

请注意,当用于在UIView中绘制时,路径将垂直翻转。

答案 1 :(得分:0)

您可以使用此扩展名绘制局部圆

extension UIBezierPath {
    func addCircle(center: CGPoint, radius: CGFloat, startAngle: Double, circlePercentage: Double) {
        let start = deg2rad(startAngle)
        let end = start + CGFloat(2 * Double.pi * circlePercentage)
        addArc(withCenter: center,
               radius: radius,
               startAngle: start,
               endAngle: end,
               clockwise: true)
    }

    private func deg2rad(_ number: Double) -> CGFloat {
        return CGFloat(number * Double.pi / 180)
    }
}

enter image description here

用法示例(您可以将其复制粘贴到操场上以查看结果)

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.backgroundColor = UIColor.green

let layer = CAShapeLayer()
layer.strokeColor = UIColor.red.cgColor
layer.fillColor = UIColor.clear.cgColor
layer.lineWidth = 8

let path = UIBezierPath()
path.addCircle(center: CGPoint(x: 50, y: 50), radius: 50, startAngle: 270, circlePercentage: 0.87)
layer.path = path.cgPath

view.layer.addSublayer(layer)
view.setNeedsLayout()