UIView上swift 3中的uibezierPath,只需要曲线

Posted

技术标签:

【中文标题】UIView上swift 3中的uibezierPath,只需要曲线【英文标题】:bezierPath in swift 3 on UIView, only curved line needed 【发布时间】:2017-09-28 16:02:20 【问题描述】:

当我在 UIView 上快速绘制 bezierPath 时。我得到了直线。我只需要曲线就可以去掉直线。

我可以通过以下方式移除灰色填充: line.fillColor = UIColor.clear.cgColor

不知道如何删除直线

代码:

    let line = CAShapeLayer()
    let linePath = UIBezierPath()
    linePath.move(to: start)
    linePath.addLine(to: end)
    var dis = (end.x - start.x)/3.0
    linePath.addCurve(to: start,
                  controlPoint1: CGPoint(x: start.x + dis, y: start.y + dis),
                  controlPoint2: CGPoint(x: end.x - dis, y: end.y - dis))

    line.path = linePath.cgPath
    line.strokeColor = UIColor.red.cgColor
    //line.fillColor = UIColor.clear.cgColor
    line.lineWidth = 4.0
    line.opacity = 0.6
    self.view.layer.addSublayer(line)

【问题讨论】:

【参考方案1】:

不要关闭路径。当您关闭贝塞尔路径时,它会在路径的开始和结束之间添加一条直线。如果您不关闭路径,那么它不应该这样做。 (但是你不能填充非封闭路径,只需描边即可。)

如果这对您没有帮助,您需要编辑您的问题以显示创建和绘制路径的代码。

【讨论】:

嗨@Duncan,我已经更新了代码。即使在关闭后它仍然绘制直线 你的代码有一个明确的命令来画一条从起点到终点的线:linePath.addLine(to: end) 它被写成从终点到起点画一条曲线。摆脱那个addLine命令,先移动到端点,然后调用添加一条从终点到起点的曲线(或移动到曲线的开头,然后重写你的linePath.addCurve添加从起点到终点的曲线。)【参考方案2】:

请尝试以下代码。指定起点和终点,用三角函数的 pi 来表示圆曲线。如果你想通过这些来使用动画,请将以下代码添加到 UIView

import UIKit

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        let pi = CGFloat(Float.pi)
        let start:CGFloat = 0.0
        let end :CGFloat = pi
        
        // circlecurve
        let path: UIBezierPath = UIBezierPath();
        path.addArc(
            withCenter: CGPoint(x:self.view.frame.width/4, y:self.view.frame.height/4),
            radius: 300,
            startAngle: start,
            endAngle: end,
            clockwise: true
        )
        let layer = CAShapeLayer()
        layer.fillColor = UIColor.clear.cgColor
        layer.strokeColor = UIColor.orange.cgColor
        layer.path = path.cgPath
        self.view.layer.addSublayer(layer)   
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

【讨论】:

以上是关于UIView上swift 3中的uibezierPath,只需要曲线的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中的 UIView 上绘制网格

iOS / Swift 3:UIPageController 中的 UIView 太大

iOS:UIView 的 Autolayout 拉伸高度过多(Xcode 8、Swift 3)

是否可以通过扩展中的 Swift 4 KeyPaths 在 UIView 上设置属性?

UIView中的UITableView与swift

swift 3中的单例计算属性