Предотвращение жестов от прохождения аннотации Просмотр к карте - PullRequest
0 голосов
/ 14 октября 2018

У меня есть UIView, который я вставляю в MKAnnotationView.

У него есть программно-сгенерированный распознаватель жестов.

Проблема заключается в том, что иногда, также вставляет в аннотацию (иливместо этого) перейдите к карте.

Я прилагаю демонстрацию, сводящуюся к уродливому, простому ViewController (см. скриншот, чтобы увидеть, как он выглядит).

Если вы создаетеприложением к нему, затем нажимайте / нажимайте несколько раз в нижнем квадрате (они меняют цвета при щелчках / нажатиях), карта будет увеличиваться.

Возможно, некоторые интерпретации интерпретируются как двойное нажатие., но я не уверен (карты симулятора МЕДЛЕННЫЕ).

Как лучше всего запретить распознавателям жестов под аннотацией получать события (даже двойные касания) в аннотации?

Скрой глаза.Это будет FUGLY:

import UIKit
import MapKit

class ViewController: UIViewController, MKMapViewDelegate {
    @IBOutlet weak var mapView: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let washingtonMonument = CLLocationCoordinate2D(latitude: 38.8895, longitude: -77.0353)
        let annotation = GestureAnnotation()
        annotation.coordinate = washingtonMonument
        self.mapView.addAnnotation(annotation)
        let washingtonRegion = MKCoordinateRegion(center: washingtonMonument, span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5))
        self.mapView.setRegion(washingtonRegion, animated: false)
    }

    func mapView(_ inMapView: MKMapView, viewFor inAnnotation: MKAnnotation) -> MKAnnotationView? {
        if let annotation = inAnnotation as? GestureAnnotation {
            return annotation.viewObject
        }
        return nil
    }
}

class GestureTargetView: UIView {
    let colors = [UIColor.red, UIColor.yellow, UIColor.black, UIColor.green]
    var tapGestureRecognizer: UITapGestureRecognizer?
    var currentColorIndex = 0

    override func layoutSubviews() {
        if nil == self.tapGestureRecognizer {
            self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(type(of: self).handleTap))
            self.addGestureRecognizer(self.tapGestureRecognizer!)
        }
        self.backgroundColor = self.colors[0]
    }

    @objc func handleTap(sender: UITapGestureRecognizer) {
        if .ended == sender.state {
            self.currentColorIndex += 1
            if self.currentColorIndex == self.colors.count {
                self.currentColorIndex = 0
            }
            self.backgroundColor = self.colors[self.currentColorIndex]
        }
    }
}

class GestureAnnotationView: MKAnnotationView {
    var gestureView: GestureTargetView!

    override func prepareForDisplay() {
        self.frame = CGRect(origin: CGPoint.zero, size: CGSize(width: 128, height: 128))
        if nil == self.gestureView {
            self.gestureView = GestureTargetView(frame: self.frame)
            self.addSubview(self.gestureView)
        }
        super.prepareForDisplay()
    }
}

class GestureAnnotation: NSObject, MKAnnotation {
    var myView: GestureAnnotationView!
    var coordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 0, longitude: 0)
    var viewObject: MKAnnotationView! {
        get {
            if nil == self.myView {
                self.myView = GestureAnnotationView(annotation: self, reuseIdentifier: "")
            }

            return self.myView
        }
    }
}

enter image description here

1 Ответ

0 голосов
/ 15 октября 2018

Просто хотел бы упомянуть, как я "решил" это.

Как и многие из этих типов вещей, я должен был придумать совершенно другой способ сделать это, в отличие от попытки прижаться кточка взлома.

Способ, которым я имел дело с этим, состоял в том, чтобы создать прозрачный UIView, который я поместил в иерархию представления по MapView.Затем я добавил свои интерактивные элементы в это представление и сбросил все, когда закончил.

Это немного странно, когда вы щелкаете в другом месте, но ничего, даже близко к тому ущербу, который был нанесен, если карта панорамировалась илив увеличенном виде.Я подозреваю, что смогу разобраться в странности, немного подумав.

...