iPhone: Detekce Tap v MKMapView

hlasů
19

Jak mohu zjistit jediným klepnutím na instanci MKMapView? Musím podtřídy MKMapViewa pak přepsat touchesEndedmetodu?

Dík,

-Chris

Položena 14/08/2009 v 03:22
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
31

Pokud jste jen chtějí být upozorňováni na vodovodní gest bez vlivu na kteroukoli další dotykové chování mapy, budete chtít použít UITapGestureRecognizer. Je to super jednoduché, stačí dát do nějaké kódu, jako je tento.

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

Že bude volat didTapMapkdykoli theMKMapViewobdrží vodovodní gesto a všechny sevření, a tažením gesta bude i nadále pracovat, jak tomu bylo dříve.

Odpovězeno 31/12/2010 v 21:30
zdroj uživatelem

Odpovězeno 10/11/2009 v 13:27
zdroj uživatelem

hlasů
2

Fungovala v systému 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 ...
     }
Odpovězeno 03/04/2015 v 10:46
zdroj uživatelem

hlasů
2

Nebo v závislosti na tom, co se snaží dělat, přidejte MKAnnotation(připínáček, s popisku), takže máte něco proniknout na - a pak se vaše mapa delegát obdrží zvláštní události, např.

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

Odpovězeno 18/09/2009 v 09:31
zdroj uživatelem

hlasů
0

moje 2 centy za 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()
        }
    }
}

funguje to. ale upřímně mohou rozlomit, když jablko mění vrstvy pohledů. Lepší rozpoznávání.

Odpovězeno 16/09/2019 v 19:19
zdroj uživatelem

hlasů
0

Nic, co jsem kdy našel upravené, ale jsem přišel s tímto unperfect řešení: V viewDidLoad

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

V delegáta:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return touch.view!.frame.equalTo(mapView.frame)
}
Odpovězeno 20/09/2017 v 09:34
zdroj uživatelem

hlasů
0

Stačí přidat nějaký fragment kódu jako ilustraci @ tt-kilew odpověď. V mém případě, já chci upozornit uživatele na sebe na mapě, ale nechtějí přerušit své tažení dotek.

@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
Odpovězeno 07/04/2017 v 13:59
zdroj uživatelem

hlasů
0

Nemůžeš v tomto okamžiku zachytit dotkne na zobrazení mapy, můžete zkusit vrstvení neprůhledný pohled tam a uvidíme, jestli to zvedne doteky ...

Odpovězeno 14/08/2009 v 03:59
zdroj uživatelem

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