【问题标题】:Swift: addLine ignored in between two addArc calls when creating a pathSwift:创建路径时在两个 addArc 调用之间忽略 addLine
【发布时间】:2020-06-15 03:08:45
【问题描述】:

这段代码符合我的预期。它画了一条弧线,然后在该弧线的顶部添加一条 50 点宽的线:

path.move(to: .init(x: myX, y: myY))

path.addArc(withCenter: CGPoint(x: centerX, y: centerY), radius: radius1, startAngle: .pi, endAngle: (3 * .pi)/2, clockwise: true)

let currentPoint = path.currentPoint
path.addLine(to: CGPoint(x: currentPoint.x + 50, y: currentPoint.y))

此代码忽略了 addLine 用于添加 50 点宽的线,而只是在第一个弧的顶部开始第二个弧。

path.move(to: .init(x: myX, y: myY))

path.addArc(withCenter: CGPoint(x: centerX, y: centerY), radius: radius1, startAngle: .pi, endAngle: (3 * .pi)/2, clockwise: true)

let currentPoint = path.currentPoint
path.addLine(to: CGPoint(x: currentPoint.x + 50, y: currentPoint.y))

path.addArc(withCenter: CGPoint(x: centerX + 50, y: centerY), radius: radius1, startAngle: (3 * .pi)/2, endAngle: .pi, clockwise: false)

使用第二段代码,如果我注释掉 addLine 代码,我会得到完全相同的输出。如果我将 addLine 代码更改为添加 300 个 pixels 点而不是 50 个点,我得到完全相同的输出。 addLine 代码被忽略,我得到两条弧线,在第一个端点和第二个端点之间没有一条线开始。

有什么建议吗?非常感谢!

【问题讨论】:

  • 你想要达到什么目的?

标签: ios swift drawing uibezierpath cashapelayer


【解决方案1】:

你说:

使用这第二段代码,如果我注释掉 addLine 代码,我会得到完全相同的输出。

是的,当您将弧线添加到现有路径时,它会自动从currentPoint 到第二条弧线的起点绘制一条线。如果您不希望它在中间添加线,则需要在路径中添加move(to:),如果您不希望中间的线开始第二个弧线。或者创建两条路径,一条用于每条弧线,然后分别描边。

如果我将 addLine 代码更改为添加 300 像素而不是 50 像素,我会得到完全相同的输出。

这不太合理,我无法重现这种行为。例如,这是我将第二个弧线移动 50pt 时得到的结果(我将对笔划进行动画处理,以便您查看发生了什么):

但这就是我将线移动 300pt 时得到的结果(但第二条弧线距离第一条弧线仅 50pt):

很明显,如果你不仅使线长 300pt,而且将第二个圆弧的中心也移动 300pt,那么它将和第一个示例一样(除了更远)。


但是,如果我将您的 addLine(to:) 替换为 move(to:),那么您将看不到它们之间的界限:


FWIW,在所有这些示例中,我不知道您使用的 myXmyY 是什么,所以我使用了第一个弧左侧的一个点。显然,如果您不想要那条额外的行,请将 myXmyY 移动到第一个弧的开头(或将其完全注释掉)。

【讨论】:

  • 这个动画笔画很有帮助!您已经解释过 addArc 会自动在该弧的开头添加一条线。那是我没有看清楚的部分。感谢您的回答!
【解决方案2】:

我不知道你的代码有什么问题,但有我尝试过的......它可能会帮助你,这就是为什么发布它

 @IBDesignable
    class CustomBg:UIView {

            private lazy var curvedLayer: CAShapeLayer = {
                let shapeLayer = CAShapeLayer()
                shapeLayer.fillColor = UIColor.yellow.cgColor
                shapeLayer.lineWidth = 4
                shapeLayer.strokeColor = UIColor.green.cgColor
                return shapeLayer
            }()

        //MARK:- inializer
        override init(frame: CGRect) {
             super.init(frame: frame)
            layer.addSublayer(curvedLayer)


        }

        required init?(coder: NSCoder) {

            super.init(coder: coder)
            layer.addSublayer(curvedLayer)

        }

        override func layoutSubviews() {
            super.layoutSubviews()
            updatePath()
        }

        func updatePath() {


            let centerX = 100
            let centerY = 100

            let radius1 = CGFloat( 50.0)

            let path = UIBezierPath()

            path.addArc(withCenter: CGPoint(x: centerX, y: centerY), radius: radius1, startAngle:0, endAngle: (2 * .pi), clockwise: true)

            let currentPoint = path.currentPoint
            path.addLine(to: CGPoint(x: currentPoint.x + 150, y: currentPoint.y))



            path.addArc(withCenter: CGPoint(x: Int(path.currentPoint.x + radius1) , y: centerY), radius: radius1 , startAngle: .pi, endAngle: (3 * .pi ), clockwise: true)

              curvedLayer.path = path.cgPath

        }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-26
    • 2013-04-24
    • 2011-08-08
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多