swift - swift 掩盖圆段

标签 swift drawing geometry masking

我正在创建一个简单的播放器应用程序。有一个圆圈,表示播放歌曲的进度。 enter image description here

在 Swift 中绘制这个圆圈并制作 mask 的最佳方法是什么?我假设我可以画一个 2 个圆圈,将宽度描边设置为我想要的厚度并且不填充它。白色的必须根据一些参数被屏蔽。我不知道如何以适当的方式掩盖它。

最佳答案

我最近想到了这个解决方案:

class CircularProgressView: UIView {

    private let floatPi = CGFloat(M_PI)
    private var progressColor = UIColor.greenColor()
    private var progressBackgroundColor = UIColor.grayColor()

    @IBInspectable var percent: CGFloat = 0.11 {
        didSet {
            setNeedsDisplay()
        }
    }
    @IBInspectable var lineWidth: CGFloat = 18

    override func drawRect(rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()
        let origo = CGPointMake(frame.size.width / 2, frame.size.height / 2)
        let radius: CGFloat = frame.size.height / 2 - lineWidth / 2
        CGContextSetLineWidth(context, lineWidth)
        CGContextMoveToPoint(context, frame.width / 2, lineWidth / 2)
        CGContextAddArc(context, origo.x, origo.y, radius, floatPi * 3 / 2, floatPi * 3 / 2 + floatPi * 2 * percent, 0)
        progressColor.setStroke()
        let lastPoint = CGContextGetPathCurrentPoint(context)

        CGContextStrokePath(context)

        CGContextMoveToPoint(context, lastPoint.x, lastPoint.y)
        CGContextAddArc(context, origo.x, origo.y, radius, floatPi * 3 / 2 + floatPi * 2 * percent, floatPi * 3 / 2, 0)
        progressBackgroundColor.setStroke()
        CGContextStrokePath(context)
    }
}

您只需为其设置一个正确的框架(通过代码或界面构建器),并设置百分比属性。

这个解决方案没有使用掩码或两个圆圈,只是两个圆弧,第一个从 12 点开始到 2 * Pi * progress percent,另一个圆弧是从前一个圆弧的末端到 12 o时钟。

重要:percent 属性必须介于 0 和 1 之间!

关于swift - swift 掩盖圆段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30554632/

相关文章:

javascript - Canvas 宽度和高度均为 100% 的质量差

drawing - Libgdx - 如何在scene2d 中的正确位置绘制填充矩形?

ios - UIDatePicker反射(reflect)选择的时间

swift - 子类化另一个 View Controller ?

ios - Facebook 集成 -ios+ Swift

c++ - 在 C++ 中的进程之间共享 CGAL 的几何结构

c# - 找到圆边上的坐标

ios - 当我滚动到当前滚动位置的顶部时,如何重新加载 UITableView? (比如聊天应用)

android - 我如何根据笔划帽计算从哪里开始我的线?

c++ - 如何根据四个旋转和缩放的点绘制椭圆?