Drawing a moving sine wave anti-aliased

后端 未结 2 1052
难免孤独
难免孤独 2020-12-24 03:55

I want to draw a moving sine wave with variable frequency and variable amplitude in a crisp and anti-aliased way. How is this possible?

2条回答
  •  清酒与你
    2020-12-24 04:52

    Made a more complete, and swift version of GeneratorOfOne's version. This one also fills the bottom of the wave with a chosen color:

    class WaveView: UIView {
    
        private var maskPath: UIBezierPath!
        @IBInspectable var fillColor: UIColor = UIColor.blueColor()
        @IBInspectable var cycles: CGFloat = 7
    
        override func drawRect(rect: CGRect) {
    
            var w: CGFloat = 0              // Starting position
            let width = rect.width
            let y: CGFloat = rect.height
            let yc: CGFloat = rect.height / 2
            let x = width/cycles
    
            let context = UIGraphicsGetCurrentContext();
            CGContextSetFillColorWithColor(context, UIColor.greenColor().CGColor);
            let path = CGPathCreateMutable();
    
            CGPathMoveToPoint(path, nil, 0, 0)
    
            while (w<=rect.width) {
                CGPathMoveToPoint(path, nil, w,y/2);
                CGPathAddQuadCurveToPoint(path, nil, w+x/4, -yc, (w+x/2), y/2);
                CGPathMoveToPoint(path, nil, w+x/2,y/2);
                CGPathAddQuadCurveToPoint(path, nil, w+3*x/4, y+yc, w+x, y/2);
                w+=x;
            }
    
            CGPathAddLineToPoint(path, nil, rect.width, rect.height)
            CGPathAddLineToPoint(path, nil, 0, rect.height)
            CGPathAddLineToPoint(path, nil, 0, y/2);
            CGPathCloseSubpath(path)
    
            maskPath = UIBezierPath(CGPath: path)
            maskPath.lineCapStyle = CGLineCap.Square
            maskPath.lineJoinStyle = CGLineJoin.Miter
    
            CGContextAddPath(context, path);
            CGContextSetFillColorWithColor(context, fillColor.CGColor)
            CGContextFillPath(context)
        }
    
    }
    

提交回复
热议问题