Использование SwiftUI MapReader для размещения видов на картеIOS

Программируем под IOS
Ответить
Anonymous
 Использование SwiftUI MapReader для размещения видов на карте

Сообщение Anonymous »

Я пытаюсь использовать SwiftUI для создания ZStack, содержащего карту (с представлением карты MapKit) и представление Circle, расположенное поверх нее. Положение пикселя круга должно совпадать с положением пикселя на карте, соответствующим определенной координате широты и долготы.
Я не использую 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)
}
}
}
ZStack заключен в MapReader, который должен предоставлять прокси-объект: MapProxy для закрытия представления, из которого координаты могут быть преобразованы между картой (в том виде, в каком она будет отображаться) и пиксельным пространством представления.
Карта центрируется вокруг 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»