绘制透明圆弧

Posted

技术标签:

【中文标题】绘制透明圆弧【英文标题】:Draw transparent Arc 【发布时间】:2017-04-06 05:37:19 【问题描述】:

我想画一条连接矩形两个角的透明弧线,这样我就可以通过弧线看到视图后面的内容。

我可以使用以下代码绘制圆弧

override func draw(_ rect: CGRect) 
    // Drawing code
    let arcHeight: CGFloat = 10
    let arcColor = UIColor.blue
    let arcRect = CGRect(x: 0, y: rect.height - arcHeight, width: rect.width, height: arcHeight)
    let arcRadius = (arcHeight / 2) + (pow(arcRect.width, 2) / (8 * arcHeight))
    let arcCenter = CGPoint(x: arcRect.origin.x + (arcRect.width / 2), y: arcRect.origin.y + arcRadius)
    
    let angle = acos(arcRect.width / (2 * arcRadius))
    let startAngle = radians(180) + angle
    let endAngle = radians(360) - angle
    
    let path = UIBezierPath(arcCenter: arcCenter, radius: arcRadius / 2, startAngle: startAngle, endAngle: endAngle, clockwise: true)
    path.lineWidth = arcRadius
    arcColor.setStroke()
    path.stroke()


private func radians(_ degrees: CGFloat) -> CGFloat 
    return degrees * CGFloat(M_PI) / 180

所以为了使圆弧透明,我需要填充矩形的剩余部分,不包括我尝试以下代码的圆弧,

let fullPath = UIBezierPath(rect: bounds)
fullPath.append(path)
fullPath.usesEvenOddFillRule = true
fullPath.addClip()
arcColor.setFill()
fullPath.fill()

但我无法达到我的预期。请指导我如何用不包括圆弧的颜色填充矩形。

请在下面找到截图,

我希望上图中的白色弧线是透明的,这样我就可以通过弧线看到视图后面的内容。

【问题讨论】:

【参考方案1】:

看来你想要这样的东西:

为了获得它,我使用了几乎相同的代码,但我首先用蓝色填充了整个rect,然后我用你的代码绘制了弧线,但是当我们开始画弧线时,我们用.clear 的混合模式,因此擦除圆弧下的区域。

class MyView : UIView 
    override init(frame:CGRect) 
        super.init(frame:frame)
        self.isOpaque = false
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    override func draw(_ rect: CGRect) 
        // Drawing code
        let arcHeight: CGFloat = 10
        let arcColor = UIColor.blue
        arcColor.setFill() // <--
        let con = UIGraphicsGetCurrentContext() // <--
        con?.fill(rect) // <--
        let arcRect = CGRect(x: 0, y: rect.height - arcHeight, width: rect.width, height: arcHeight)
        // ... same as your code ...
        path.stroke(with: .clear, alpha: 1)
    

    private func radians(_ degrees: CGFloat) -> CGFloat 
        return degrees * CGFloat(M_PI) / 180
    


【讨论】:

以上是关于绘制透明圆弧的主要内容,如果未能解决你的问题,请参考以下文章

CAD参数绘制圆弧(网页版)

CAD参数绘制圆弧(com接口)

MFC 动态绘制直线,圆弧段(连续)如何实现

Canvas中怎么绘制圆和圆弧

模拟PLC 的圆弧插补方式在VC中绘制圆弧

canvas绘制圆弧