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?
  • Что-то не так с моим кодом? И если да, то как это сделать правильно?

0 ответов

Другие вопросы по тегам