菜鸟教程小白 发表于 2022-12-11 19:46:28

ios - UIBezierPath 绘制矩形以及所需的圆


                                            <p><p>我正在尝试使用 <code>UIBezierPath(rect:)</code> 构造函数绘制圆形,但随着圆形 - 矩形形状也被绘制为框架并且可见。这是我的代码:</p>

<pre><code>class ProgressView: UIView {
let progressLayer = CustomShapeLayer()//declared below this class
override init(frame: CGRect) {
    super.init(frame: frame)
    self.isOpaque = false
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

}
override func draw(_ rect: CGRect) {
    let bounds = self.layer.bounds
    let centerX = bounds.midX
    let centerY = bounds.midY

    let upperCenterPoint = CGPoint(x: centerX, y: (centerY))
    let arcPathStartAngle: CGFloat = 2 * .pi
    let arcPathEndAngle: CGFloat = 0.0
    let radius: CGFloat = bounds.size.width / 3

    print(centerX, centerY, radius, &#34;dim&#34;)

    let strokeWidth: CGFloat = 1//to show rect being formed
    let arcPath = UIBezierPath(rect: bounds.insetBy(dx: -strokeWidth, dy: -strokeWidth))

    arcPath.move(to: CGPoint(x: centerX + radius, y: centerY))
    arcPath.addArc(withCenter: upperCenterPoint, radius: radius, startAngle: arcPathStartAngle, endAngle: arcPathEndAngle, clockwise: false)
    arcPath.close()

    progressLayer.strokeColor = UIColor.white.cgColor
    progressLayer.path = arcPath.cgPath
    self.layer.addSublayer(progressLayer)

    let animateStrokeEnd = CABasicAnimation(keyPath: &#34;strokeEnd&#34;)
    animateStrokeEnd.duration = 2.0
    animateStrokeEnd.fromValue = 0.0
    animateStrokeEnd.toValue = 1.0

    progressLayer.add(animateStrokeEnd, forKey: &#34;animate stroke end animation&#34;)
}
}

//subclassing
class CustomShapeLayer: CAShapeLayer {
override init() {
    super.init()

    self.fillColor = UIColor.clear.cgColor
    self.lineWidth = CGFloat(5*Double.pi)
    self.lineCap = kCALineCapRound
}

required init?(coder aDecoder: NSCoder) {
    fatalError(&#34;init(coder:) has not been implemented&#34;)
}
}
</code></pre>

<p>我不需要将矩形绘制为框架,我是否只需要使用 <code>UIBezierPath</code> 空构造函数(<em>因为它服务于目的</em>),并且不能使用 <code>UIBezierPath(rect:)</code> 构造函数是否相同?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>替换这个 <code>let arcPath = UIBezierPath()</code> 的贝塞尔路径初始化您的问题是您正在使用 <code>UIBezierPath(rect:</code> 进行初始化,它会创建一个矩形路径可以在这张图片中看到</p>

<p> <a href="/image/xKBpf.png" rel="noreferrer noopener nofollow"><img src="/image/xKBpf.png" alt="enter image description here"/></a> </p>

<p><strong>完整的绘制方法代码</strong></p>

<pre><code>override func draw(_ rect: CGRect) {
    let bounds = self.layer.bounds
    let centerX = bounds.midX
    let centerY = bounds.midY

    let upperCenterPoint = CGPoint(x: centerX, y: (centerY))
    let arcPathStartAngle: CGFloat = 2 * .pi
    let arcPathEndAngle: CGFloat = 0.0
    let radius: CGFloat = bounds.size.width / 3

    print(centerX, centerY, radius, &#34;dim&#34;)

    let strokeWidth: CGFloat = 1//to show rect being formed
    let arcPath = UIBezierPath()
    arcPath.move(to: CGPoint(x: centerX + radius, y: centerY))
    arcPath.addArc(withCenter: upperCenterPoint, radius: radius, startAngle: arcPathStartAngle, endAngle: arcPathEndAngle, clockwise: false)
    arcPath.close()

    progressLayer.strokeColor = UIColor.white.cgColor
    progressLayer.path = arcPath.cgPath
    self.layer.addSublayer(progressLayer)

    let animateStrokeEnd = CABasicAnimation(keyPath: &#34;strokeEnd&#34;)
    animateStrokeEnd.duration = 2.0
    animateStrokeEnd.fromValue = 0.0
    animateStrokeEnd.toValue = 1.0

    progressLayer.add(animateStrokeEnd, forKey: &#34;animate stroke end animation&#34;)
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIBezierPath 绘制矩形以及所需的圆,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/48884015/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/48884015/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIBezierPath 绘制矩形以及所需的圆