iPhone: Erkennen Tippen Sie in MKMapView

stimmen
19

Wie erkenne ich einen einzigen Druck auf eine Instanz MKMapView? Muss ich Unterklasse MKMapViewund dann setzen die Zuweisung touchesEndedMethode?

Vielen Dank,

-Chris

Veröffentlicht am 14/08/2009 um 03:22
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
31

Wenn Sie gerade Gelegenheit zum Leitungs Gesten mitgeteilt , ohne dass einer der anderen Berührungsverhalten der Karte zu beeinflussen, sollten Sie ein verwenden UITapGestureRecognizer. Es ist super einfach, nur in einigen Code so sagen.

UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc] 
   initWithTarget:self action:@selector(didTapMap:)];
[theMKMapView addGestureRecognizer:tapRec];
[tapRec release];

Das wird der Anruf , didTapMapwenn theMKMapViewerhält eine Tippgeste und all das Einklemmen und Ziehen Gesten noch funktioniert wie zuvor.

Beantwortet am 31/12/2010 um 21:30
quelle vom benutzer

Beantwortet am 10/11/2009 um 13:27
quelle vom benutzer

stimmen
2

Funktionierend auf iOS 8

- (void)viewDidLoad 
    {
        [super viewDidLoad];

        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:nil];
        doubleTap.numberOfTapsRequired = 2;
        doubleTap.numberOfTouchesRequired = 1;
        [self.mapView addGestureRecognizer:doubleTap];

        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
        singleTap.numberOfTapsRequired = 1;
        singleTap.numberOfTouchesRequired = 1;
        [singleTap requireGestureRecognizerToFail: doubleTap];
        [self.mapView addGestureRecognizer:singleTap];
     }

   - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
     {
            if (gestureRecognizer.state != UIGestureRecognizerStateEnded)
                return;
            //Do your work ...
     }
Beantwortet am 03/04/2015 um 10:46
quelle vom benutzer

stimmen
2

Oder je nachdem , was Sie versuchen , eine zu tun, fügen Sie MKAnnotation(Push - Pin, mit einem Richtungsanzeiger), so haben Sie etwas tippen auf - und dann Karte Delegat ein Ereignis zB erhalten.

mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

Beantwortet am 18/09/2009 um 09:31
quelle vom benutzer

stimmen
0

my 2 cents für swit 5.x:

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
        let v = touch.view
        let ssv = v?.superview?.superview
        if ssv === self.mapView{
            searchBar.resignFirstResponder()
        }
    }
}

Es klappt. aber ehrlich gesagt kann brechen, wenn Apfelschichten Ansichten ändern. Besser einen Erkenner.

Beantwortet am 16/09/2019 um 19:19
quelle vom benutzer

stimmen
0

Nichts, was ich gefunden jemals gearbeitet, aber ich kam mit dieser unperfect Lösung: In viewDidLoad

let singleTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(onMapClicked))
singleTapRecognizer.delegate = self
mapView.addGestureRecognizer(singleTapRecognizer)

In Delegierten:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return touch.view!.frame.equalTo(mapView.frame)
}
Beantwortet am 20/09/2017 um 09:34
quelle vom benutzer

stimmen
0

einigen Code-Schnipsel als Illustration von @ tt-kilew Antwort einfach hinzufügen. In meinem Fall möchte ich den Benutzer selbst auf der Karte zeigen, wollen aber nicht seine Drag Kontakt zu unterbrechen.

@interface PrettyViewController () <MKMapViewDelegate>

@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (assign, nonatomic) BOOL userTouchTheMap;

@end

@implementation PrettyViewController

#pragma mark - UIResponder

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    self.userTouchTheMap = [[touches anyObject].view isEqual:self.mapView];
}


#pragma mark - MKMapViewDelegate

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    //We just positioning to user
    if (!self.userTouchTheMap) {
        CLLocationDistance radius = 5000;
        [self.mapView setRegion:MKCoordinateRegionMakeWithDistance(userLocation.location.coordinate, 2*radius, 2*radius) animated:YES];
    }
}

@end
Beantwortet am 07/04/2017 um 13:59
quelle vom benutzer

stimmen
0

Sie kann nicht zu diesem Zeitpunkt Intercept auf einer Karte berührt, können Sie dort Schichtung eine undurchsichtige Ansicht versuchen und sehen, ob es berührt nimmt ...

Beantwortet am 14/08/2009 um 03:59
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more