Я не использую MapAnnotation и т. д., которые должны быть частью самой карты, а вместо этого использую отдельные виды поверх представления карты. (Поскольку в реальном приложении положение представления не является непосредственно x/y координаты широты/долготы, а рассчитывается на основе этого.)
В настоящее время у меня есть такой код:
Код: Выделить всё
import SwiftUI
import MapKit
import CoreLocation
struct ContentView: View {
@State private var mapCenterCoordinate = CLLocationCoordinate2D(
latitude: 37.3342284,
longitude: -122.0106683
)
@State private var shownCoordinate = CLLocationCoordinate2D(
latitude: 37.3347206,
longitude: -122.0059942
)
@State private var heading: Double = 0
@State private var xyPosition: CGPoint?
private var mapCameraPosition: MapCameraPosition {
return .camera(
MapCamera(
centerCoordinate: mapCenterCoordinate,
distance: 3000,
heading: heading,
pitch: 0
)
)
}
var body: some View {
VStack {
MapReader { proxy in
ZStack {
Map(position: .constant(mapCameraPosition))
.onMapCameraChange() {
xyPosition = proxy.convert(shownCoordinate, to: .local)
print("xyPosition changed to \(xyPosition)")
}
if xyPosition != nil {
Circle()
.fill(.red)
.frame(width: 12, height: 12)
.position(xyPosition!)
}
}
}
Slider(value: $heading, in: 0...360, step: 1)
}
}
}
Карта центрируется вокруг mapCenterCoordinate, с заголовком, заданным заголовком @State, который можно настроить с помощью ползунка. Таким образом, перемещение ползунка вращает карту, что приводит к сбросу карты с новым аргументом позиции.
Я использую MapProxy в onMapCameraChange(), чтобы установить @State xyPosition в позиции пикселей x,y, которые соответствуют показанной координате, с текущей позицией/заголовком карты.
Эти слова корректны, когда я перемещаю/поворачиваю карту проведя по самому виду карты. Красный кружок правильно размещается в правильном положении.
Но когда я перемещаю ползунок, чтобы повернуть карту (а также центрировать ее обратно в mapCenterCoordinate), это не работает:
onMapCameraChange() вызывается, но xyPosition всегда устанавливается в ноль. Даже если displayCoordinate находится в пределах карты.
Есть ли способ заставить это работать?
В реальном приложении не будет никакого взаимодействия с пользователем в самом представлении карты.
Я также пробовал вызывать proxy.convert() непосредственно при закрытии представления ZStack (после Map()), не используя onMapCameraChange(), но это приводит к Ошибки «AttributeGraph: цикл обнаружен».
Альтернативно, есть ли способ напрямую вычислить координаты x/y по широте/долготе из MapCamera без использования MapReader/MapProxy?
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-over-map
Мобильная версия