Нажатие на SwiftUI MKMapView приводит к неправильным координатам - PullRequest
0 голосов
/ 02 февраля 2020

Я размещаю MKMapView в структуре SwiftUI View и имею функцию getPoint(rect:), которая должна преобразовывать CGRect в MKMapView в координаты на карте. Это работает правильно, однако, в приведенном ниже примере кода есть неприятная ошибка.

Когда я нажимаю и перетаскиваю MKMapView, он корректно перемещается, однако, после этого, всякий раз, когда я вызываю функцию getPoint(rect:), печатаемые координаты всегда (-180, -180,0,0). Например, если I:

  1. Запустить проект.
  2. Нажмите на кнопку, чтобы получить правильные координаты: MKCoordinateRegion (center: __ C .CLLocationCoordinate2D (широта: 58.952740592075, долгота : -8.606628292991132), диапазон: __ C .MKCoordinateSpan (latitudeDelta: 0.4606441267309549, longitudeDelta: 0.8931584724545871))
  3. Нажмите и перетащите на кнопку MKMapView.
  4. Нажмите на кнопку , получая неверные координаты: MKCoordinateRegion (центр: __ C .CLLocationCoordinate2D (широта: -180.0, долгота: -180.0), диапазон: __ C .MKCoordinateSpan (широтаDelta: 0.0, долготаDelta : 0.0))

Это происходит каждый раз, но не происходит, если я использую трекпад для прокрутки MKMapView. Кажется, это происходит только при наличии логического связывания.

import MapKit

struct Parent : View {
    @State var boolean: Bool = false

    var body : some View {
        VStack {
            Child(boolean: $boolean)
            Text(boolean ? "Yes" : "No")
        }
    }
}

struct Child : View {
    var mapsView:MapsView = MapsView()
    @Binding var boolean:Bool

    var body : some View {
        VStack {
            mapsView

            Button(action: {
                self.mapsView.getPoint(rect: CGRect(origin: .zero, size: CGSize(width: 30, height: 30)))
                self.boolean.toggle()
            }) {
                Text("Toggle")
            }
        }
    }

    struct MapsView: NSViewRepresentable {
        var map:MKMapView = MKMapView(frame: .zero)

        func makeNSView(context: Context) -> MKMapView  {
            map.isRotateEnabled = false
            return map
        }

        func updateNSView(_ view: MKMapView, context: Context) {

        }

        func getPoint(rect: CGRect) {
            let a = map.convert(rect, toRegionFrom: map)
            print(a)
        }
    }
}
...