#ios #arrays #swift #loops #cgpath
#iOS #массивы #swift #циклы #cgpath
Вопрос:
У нас есть массив координат, и мы хотим выполнить цикл по ним, чтобы нарисовать путь. Вот как это выглядит с жестко заданными значениями:
func createPath(){
path.move(to: CGPoint(x: 32.7915055, y: -96.8028408))//1
path.addLine(to: CGPoint(x: 32.79174845, y: -96.80252195))
path.addLine(to: CGPoint(x: 32.7919914, y: -96.8022031))//2
path.addLine(to: CGPoint(x: 32.791501100000005, y: -96.80235195))
path.addLine(to: CGPoint(x: 32.7910108, y: -96.8025008))//3
path.addLine(to: CGPoint(x: 32.791301700000005, y: -96.8020985))
path.addLine(to: CGPoint(x: 32.7915926, y: -96.8016962))//4
path.addLine(to: CGPoint(x: 32.79154905, y: -96.8022685))
}
но мы пытаемся не жестко кодировать, а вместо этого создать функцию, которая принимает массив координат, подобный этому:
func create(coordinates: [CLLocationCoordinate2D]) {
for coordinate in coordinates {
path.move(to: CGPoint(x: coordinate.x, y:coordinate.y))//error
path.addLine(to: CGPoint(x: coordinate.x, y: coordinate.y))//error
}
}
Проблема в том, как получить первую координату в массиве для «path.move», а затем использовать дополнительные координаты для использования в части функции «path.AddLine»?
Ответ №1:
перечислите массив и проверьте его индекс:
for (index, coordinate) in coordinates.enumerated() {
if index == 0 {
path.move(to: CGPoint(x: coordinate.longitude, y:coordinate. latitude))
} else {
path.addLine(to: CGPoint(x: coordinate.longitude, y: coordinate.latitude))
}
}
также обратите внимание, что CLLocationCoordinate2D
не имеет x
nor y
но longitude
и latitude
Ответ №2:
Для этого есть удобный CGContext.addLines(between:)
метод. Вот описание из документов:
Вызов этого удобного метода эквивалентен вызову метода move(to:) с первым значением в массиве точек, а затем вызову метода AddLine(to:) для каждой последующей точки, пока массив не будет исчерпан. После вызова этого метода текущая точка пути является последней точкой в массиве.
Использование:
let cgPoints = coordinates.map { CGPoint(x: $0.longitude, y: $0.latitude) }
ctx.addLines(between: cgPoints)