SwiftUI Представления, блокирующие касания к MapKit, но не другие представления - PullRequest
1 голос
/ 19 апреля 2020

Я представляю mapView через UIViewRepresentable и хочу, чтобы изображение «target» находилось в центре карты. Это изображение блокирует как события касания, так и жесты панорамирования, которые начинаются на изображении. Поэтому добавление аннотации на карту под изображением означает, что ее выноска не может быть инициирована.

enter image description here

Я читал о проблемах с прозрачностью, поэтому Я переделал целевое изображение с «чистой» областью в белый цвет с непрозрачностью 1%, но без изменений в поведении.

Установка allowsHitTesting в false также не работает, хотя, если я вставлю кнопку под изображением (Тест 1 в коде) Я могу нажать на него, но не на карту / аннотацию, поэтому, похоже, есть разница между элементами MapKit и представлениями SwiftUI, которые я добавляю сам.

import SwiftUI
import MapKit

struct ContentView: View {
    var body: some View {
        ZStack {
            MapView()

/*Test 1*/  Button("Tap Me") {
                print("Text button was tapped")
            }

            Image("target")
                .frame(width: 90, height: 90)
                .allowsHitTesting(false)

/*Test 2*/  Rectangle()
                .fill(Color.red.opacity(0.2))
                .frame(width: 90, height: 90)
                .allowsHitTesting(false)

/*Test 3*/  Button(action: {print("Round button was tapped")}) {
                Circle()
                    .fill(Color.red.opacity(0.2))
                    .frame(width: 90, height: 90)
            }
            .allowsHitTesting(false)
            .disabled(true)
        }
    }
}

struct MapView: UIViewRepresentable {
    func makeUIView(context: Context) -> MKMapView {
        let map = MKMapView()
        map.mapType = .standard
        map.isRotateEnabled = false

        let location = CLLocation(latitude: 40.763783, longitude: -73.973133)
        let region = MKCoordinateRegion(center: location.coordinate, latitudinalMeters: 2000, longitudinalMeters: 2000)
        map.setRegion(region, animated: true)

        let annotation = MyAnnotation(coordinate: location.coordinate)
        annotation.title = "Title"
        annotation.subtitle = "Subtitle"
        map.addAnnotation(annotation)

        return map
    }

    func updateUIView(_ uiView: MKMapView, context: Context) {

    }
}

class MyAnnotation: NSObject, MKAnnotation {
    var coordinate: CLLocationCoordinate2D
    var title: String?
    var subtitle: String?

    init(coordinate: CLLocationCoordinate2D) {
        self.coordinate = coordinate
    }
}

Замена изображения для Прямоугольник (тест 2 в коде) имеет то же поведение, я могу взаимодействовать с добавляемыми представлениями, но не могу передать свои касания / панорамирование элементам MapKit. Я даже пытался использовать отключенную кнопку в надежде, что ее тестирование попаданий будет более соответствовать тому, чего я пытаюсь достичь. К сожалению, нет.

Кто-нибудь знает способ взаимодействия с mapView, касаниями и панорамированием через другой вид?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Да, даже прозрачные изображения не допускают показов. В вашем случае, достаточно простой, возможный подход заключается в создании пользовательской фигуры, как показано ниже. Фигуры пропускают хиты.

Вот простая демонстрация формы, показывающая направление.

demo

struct Cross: Shape {
    func path(in rect: CGRect) -> Path {
        return Path { path in
            path.move(to: CGPoint(x: rect.midX, y: 0))
            path.addLine(to: CGPoint(x: rect.midX, y: rect.maxY))
            path.move(to: CGPoint(x: 0, y: rect.midY))
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.midY))
            path.move(to: CGPoint(x: rect.midX, y: rect.midY))
            path.addArc(center: CGPoint(x: rect.midX, y: rect.midY), radius: 10, startAngle: Angle(degrees: 0), endAngle: Angle(degrees: 360), clockwise: false)
        }
    }
}

struct ContentView: View {
    var body: some View {
        ZStack {
            MapView()
            Cross().stroke(Color.red)
               .frame(width: 90, height: 90)
        }
    }
}
0 голосов
/ 19 апреля 2020

работает, если вы отключите все вышеперечисленное ...

, поэтому кнопка "коснитесь меня" работает.

struct ContentView: View {
    var body: some View {
        ZStack {
            MapView()

/*Test 1*/  Button("Tap Me") {
                print("Text button was tapped")
            }

            Image("target")
                .frame(width: 90, height: 90)
                .allowsHitTesting(false)
            .allowsHitTesting(false)
            .disabled(true)
/*Test 2*/  Rectangle()
                .fill(Color.red.opacity(0.2))
                .frame(width: 90, height: 90)
                .allowsHitTesting(false)
            .allowsHitTesting(false)
            .disabled(true)
/*Test 3*/  Button(action: {print("Round button was tapped")}) {
                Circle()
                    .fill(Color.red.opacity(0.2))
                    .frame(width: 90, height: 90)
            }
            .allowsHitTesting(false)
            .disabled(true)
        }
    }
}
...