Как рисовать линию дуги/кривой с помощью MKOverlayView на MKMapView
Теперь нужна помощь.
Я могу рисовать линии с помощью MKPolyline и MKPolylineView, но как рисовать линии дуги или кривой между двумя координатами на MKMapView?
Большое спасибо.
Окончательное решение
Наконец, я написал себе эти выводы, чтобы помочь тем, кто этого хочет.
Если вы хотите:
- просто нарисуйте дугу на карте
- просто нарисуйте изображение на карте
- объединить путь дуги и изображение как оверлей на карте
Итак, решения:
- Есть MKPolyline и MKPolylineView для рисования линий, MKPolygon и MKPolygonView для рисования полигонов, MKCircle и MKCircleView, чтобы нарисовать круги. Никто не подходит? Где дуга? О да. Теперь действительно решение: вы создаете пользовательский класс из MKOverlayPathView и переопределяете метод -createPath, в -createPath вы создаете использование дуги CGContextAddArcToPoint или другие функции, которые вам нравятся, и сопоставьте путь, который вы только что создали, к свойству пути MKOverlayPathView, и пользовательские работы будут выполнены. Затем вы добавляете MKPolyline на карту (да! Просто MKPolyline!), Затем в методе -mapView: viewForOverlay: вы создаете пользовательский класс для этой полилинии. Затем просто запустите его, все работает по вашему желанию. Магия? вы можете нарисовать MKPolyline как дугу!
- Просто изображение? Используйте MKAnnotationView. Это сделано! ты можешь это сделать! Я верю, что!
- В моей проблеме я хочу нарисовать дугу с изображением в оверлее. Поэтому я создаю пользовательский класс, соответствующий протоколу MKOverlay, и пользовательский класс, полученный из MKOverlayView, чтобы нарисовать этот оверлей. Все работает отлично, но я не могу нарисовать какой-либо путь на карте! Я установил lineWidth в 1,2,3,4... но это не сработало! Ах.. в решении задается ширина линии с помощью функции MKRoadWidthAtZoomScale (zoomScale), и вы можете увидеть путь! Это сделано......
И некоторые советы здесь:
- Используйте Core Graphic для рисования путей, а не координат MapKit и координат UIView!
- В функциях CG просто имейте в виду, что ширина строки должна быть преобразована этой функцией: MKRoadWidthAtZoomScale (zoomScale)
- Надеемся помочь.
Ответы
Ответ 1
Считывая документацию, кажется, что вы можете создать экземпляр MKOverlayPathView
и назначить произвольный объект CGPathRef
его свойству path
. Этот путь может содержать как прямые, так и дуги.
Я не знаю (и в документации не упоминается), в каком формате должны стоять координаты пути (MKMapPoint
или CLLocationCoordinate2D
), но вы, вероятно, можете найти это, поэкспериментируя немного.
Ответ 2
Вы уже сами ответили на свой комментарий, но я хотел бы указать всем на отличный проект AIMapViewWrapper на GitHub, который включает в себя пример кода для построения траектории дуги по набору координат. В этом проекте он используется для рисования пути, который принимает плоскость, включая теневой путь под ним (и другие вещи, такие как анимация плоскости вдоль этого пути). Может пригодиться, если кто-то упирается в это.