GeometryReader иногда выдает неправильное начало кадра .global для аннотаций карты.
Испытательная установка:
у меня естьView
который отображает модальноMap
с аннотациями:
struct Annotation: Identifiable {
let id = UUID()
let name: String
let coordinate: CLLocationCoordinate2D
}
struct MapViewSWUI: View {
@Binding var show_map_modal: Bool
@State var region: MKCoordinateRegion
var body: some View {
let _ = Self._printChanges()
VStack {
ZStack { // Top bar
Text("Oo")
.bold()
HStack {
Button(action: {
show_map_modal = false
}) {
HStack(spacing: 10) {
Image(systemName: "chevron.left")
Text(NSLocalizedString("BACK", comment: " "))
}
.padding(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 0))
}
Spacer()
}
}
let annotations = [Annotation(name: "0",
coordinate: CLLocationCoordinate2D(latitude: 49.450534, longitude: 8.6694930)),
Annotation(name: "1",
coordinate: CLLocationCoordinate2D(latitude: 49.450701, longitude: 8.6677427))
]
Map(coordinateRegion: $region,
interactionModes: .all,
showsUserLocation: false,
annotationItems: annotations) { annotation in
MapAnnotation(coordinate: annotation.coordinate, anchorPoint: CGPoint(x: 0.5, y: 1)) {
GeometryReader { geo in
Color(.green)
.onAppear {
print("Annotation coordinate: (\(annotation.coordinate.latitude),\(annotation.coordinate.longitude))")
print(".global origin: \(geo.frame(in: .global).origin)")
}
}
.frame(width: 30, height: 30)
}
}
} // VStack
}
}
Когдаshow_map_modal
установлен наtrue
, карта показана с тестовыми аннотациями:
Проблема:
При отображении карты обычно регистрируется следующее:
MapViewSWUI: @self, @identity, _region, _annotationDragged changed.
2023-01-07 09:19:17.254324+0100 ShopEasy![47736:11270478] Metal API Validation Enabled
MapViewSWUI: _region changed.
Annotation coordinate: (49.450534,8.669493)
.global origin: (271.94092664926427, 438.1697202246186)
Annotation coordinate: (49.450701,8.6677427)
.global origin: (91.00613205620596, 411.6026828329208)
Однако также может случиться так, что в журнале будет зарегистрировано следующее:
MapViewSWUI: @self, @identity, _region, _annotationDragged changed.
MapViewSWUI: _region changed.
Annotation coordinate: (49.450701,8.6677427)
.global origin: (-15.0, 76.66666666666666)
Annotation coordinate: (49.450534,8.669493)
.global origin: (-15.0, 76.66666666666666)
Когда я закрываю отображаемую модально карту с помощью кнопки «Назад» («Zurück») и снова отображаю карту, происходит то же самое (один из журналов выше).
Испробованные обходные пути:
- Когда внутри я вставляю операторы печати в
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { // … }
, координаты кажутся всегда правильными. Но это похоже на взлом. - Когда я заменю
.onAppear
к.onTapGesture
,frame
координаты также кажутся всегда правильными. К сожалению, мне нужны координаты, когда аннотации появляются на экране, без дальнейшего взаимодействия с пользователем.
Вопросы:
- Как это возможно, что аннотации (зеленый квадрат) правильно размещены на карте, но
GeometryReader
дает иногда правильный.global
координаты экрана, но иногда другое странное значение(-15.0, 76.66666666666666)
то есть, если дано, всегда одно и то же? Это ошибка SwiftUI? - Что-то не так с моим кодом? И если да, то как это сделать правильно?