【问题标题】:UIBezierPath Star with rounded cornersUIBezierPath Star 圆角
【发布时间】:2019-08-11 08:31:51
【问题描述】:

我使用以下代码通过 UIBezierPath 创建了一个星形图像:

    let path = UIBezierPath()
    let center = CGPoint(x: rect.width / 2.0, y: rect.height / 2.0)
    let xCenter: CGFloat = center.x
    let yCenter: CGFloat = center.y
    let w = rect.width
    let r = w / 2.0
    let flip: CGFloat = -1.0 // use this to flip the figure 1.0 or -1.0
    let polySide = CGFloat(5)
    let theta = 2.0 * Double.pi * Double(2.0 / polySide)
    path.move(to: CGPoint(x: xCenter, y: r * flip + yCenter))
    for i in 1..<Int(polySide) {
        let x: CGFloat = r * CGFloat( sin(Double(i) * theta) )
        let y: CGFloat = r * CGFloat( cos(Double(i) * theta) )
        path.addLine(to: CGPoint(x: x + xCenter, y: y * flip + yCenter))
    }
    path.close()

我想给星星的每个角赋予角半径。我试过了,但我想不通。你能帮我做这件事吗?

【问题讨论】:

  • 向我们展示最终路径对象的样子。 “我试过 smth”是什么意思?
  • El Tomato,没什么大不了的。我认为它对你没有帮助。

标签: ios swift uibezierpath


【解决方案1】:

这是一个自定义的UIView,它使用cornerRadius 计算 5 点星的路径:

class RoundedStar : UIView {
    var cornerRadius: CGFloat = 10 { didSet { setNeedsDisplay() } }
    var rotation: CGFloat = 54     { didSet { setNeedsDisplay() } }
    var fillColor = UIColor.red    { didSet { setNeedsDisplay() } }

    override func draw(_ rect: CGRect) {
        let path = UIBezierPath()
        let center = CGPoint(x: rect.width / 2, y: rect.height / 2)
        let r = rect.width / 2
        let rc = cornerRadius
        let rn = r * 0.95 - rc

        var cangle = rotation
        for i in 1 ... 5 {
            // compute center point of tip arc
            let cc = CGPoint(x: center.x + rn * cos(cangle * .pi / 180), y: center.y + rn * sin(cangle * .pi / 180))

            // compute tangent point along tip arc
            let p = CGPoint(x: cc.x + rc * cos((cangle - 72) * .pi / 180), y: cc.y + rc * sin((cangle - 72) * .pi / 180))

            if i == 1 {
                path.move(to: p)
            } else {
                path.addLine(to: p)
            }

            // add 144 degree arc to draw the corner
            path.addArc(withCenter: cc, radius: rc, startAngle: (cangle - 72) * .pi / 180, endAngle: (cangle + 72) * .pi / 180, clockwise: true)

            cangle += 144
        }

        path.close()
        fillColor.setFill()
        path.fill()
    }
}

在 Playground 中运行的示例:


模拟器演示

代码:

class ViewController: UIViewController {

    @IBOutlet weak var rstar: RoundedStar!
    @IBOutlet weak var cornerRadiusLabel: UILabel!
    @IBOutlet weak var rotationlabel: UILabel!

    @IBAction func cornerRadiusChanged(_ sender: UISlider) {
        rstar.cornerRadius = CGFloat(sender.value)
        cornerRadiusLabel.text = "Corner Radius: \(Int(sender.value))"
    }

    @IBAction func rotationChanged(_ sender: UISlider) {
        rstar.rotation = CGFloat(sender.value)
        rotationlabel.text = "Rotation: \(Int(sender.value))"
    }
}

【讨论】:

  • 是否有不同形状的仓库,比如三角形、心形等?
  • 我不知道。这是我今天从头开始写的。
猜你喜欢
  • 2017-07-02
  • 1970-01-01
  • 2013-04-16
  • 2017-09-12
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
相关资源
最近更新 更多