Я не нашел статей, посвященных этой проблеме, хотя думал, что это более распространенная проблема. Эту пустоту в этой теме я хочу заполнить этой статьей.
Создание линии
Сначала давайте реализуем функцию, которая создает UIBezierPath через заданный массив CGPoints.
func createBezierPath(from coordinates: [CGPoint]) -> UIBezierPath { let path = UIBezierPath() guard let startPoint = coordinates.first else { return path } for (idx, point) in coordinates.enumerated() { if idx == 0 { path.move(to: point) continue } path.addLine(to: point) } return path }
Сначала мы создали пустой UIBezierPath. Затем мы проверяли, есть ли у него точка, а если нет, возвращали пустой путь.
Затем проходим по всем точкам. Если это первая точка, мы перемещаем нашу воображаемую кисть в эту точку с помощью функции .move(to:_). Для всех остальных точек мы добавляем линию от нашей предыдущей точки до текущей точки. Если мы хотим рисовать только прямые линии, нам нужны только начальная и конечная точки, переместите кисть в начальную точку и добавьте линию в конечную точку.
Рисование UIBezierPath
Как теперь нарисовать путь, который возвращает функция выше? Для этого есть два способа. Один из них — создание собственного класса, который наследуется от класса View UIKit и требует переопределения функции onDraw(). В некоторых сценариях это может быть полезно, но второй вариант немного проще, поэтому сейчас я его покажу. Внутри функции loadView контроллера представления вам необходимо написать следующее:
let pathLayer = CAShapeLayer() pathLayer.path = path.cgPath pathLayer.strokeColor = UIColor.blue.cgColor pathLayer.lineWidth = 3.0 view.layer.addSublayer(pathLayer)
Мы создаем подслой для нашего представления, и этот подслой будет содержать наш путь. Вы можете добавить несколько подслоев.
Создание пунктирной линии
Самое близкое, что я смог найти для линии чередующихся цветов, — это пунктирная линия. Это явно не то, что нам нужно, но пригодится позже.
func createDashedBezierPath(from coordinates: [CGPoint]) ->…