Весь кредит vacawama ответ . Вы можете добиться этого, как показано ниже,
class SineView: UIView {
let graphWidth: CGFloat = 0.15
let amplitude: CGFloat = 0.1
override func draw(_ rect: CGRect) {
let width = rect.width
let height = rect.height
let origin = CGPoint(x: 0, y: height * 0.50)
let path = UIBezierPath()
path.move(to: origin)
var endY: CGFloat = 0.0
let step = 5.0
for angle in stride(from: step, through: Double(width) * (step * step), by: step) {
let x = origin.x + CGFloat(angle/360.0) * width * graphWidth
let y = origin.y - CGFloat(sin(angle/180.0 * Double.pi)) * height * amplitude
path.addLine(to: CGPoint(x: x, y: y))
endY = y
}
path.addLine(to: CGPoint(x: width, y: endY))
path.addLine(to: CGPoint(x: width, y: height))
path.addLine(to: CGPoint(x: 0, y: height))
path.addLine(to: CGPoint(x: 0, y: origin.y))
UIColor.black.setFill()
path.fill()
UIColor.black.setStroke()
path.stroke()
}
}
Использование
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let size = view.frame.size
let sineView = SineView(frame: CGRect(x: 0, y: 100, width: size.width, height: 60))
sineView.backgroundColor = .white
self.view.addSubview(sineView)
}
}
выход
Вы можете поиграть с graphWidth
и amplitude
, чтобы настроить график так, как вам нравится.