iPhone: Opsporen Tap in MKMapView

stemmen
19

Hoe kan ik detecteren een enkele tik op een exemplaar van MKMapView? Moet ik subklasse MKMapViewen overschrijven de touchesEndedmethode?

Bedankt,

-Chris

De vraag is gesteld op 14/08/2009 om 03:22
bron van user
In andere talen...                            


8 antwoorden

stemmen
31

Als je gewoon op zoek naar een melding van de tap gebaren, zonder afbreuk te doen aan de andere touch gedrag van de kaart, wil je een gebruiken UITapGestureRecognizer. Het is super simpel, gewoon in een code als deze.

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

Dat zal noemen didTapMapwanneer theMKMapViewontvangt een kraan gebaar en alle knijpen, en te slepen gebaren zal nog steeds werken zoals ze voorheen.

antwoordde op 31/12/2010 om 21:30
bron van user

antwoordde op 10/11/2009 om 13:27
bron van user

stemmen
2

Werkte op 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 ...
     }
antwoordde op 03/04/2015 om 10:46
bron van user

stemmen
2

Of afhankelijk van wat u probeert te doen, voegt u een MKAnnotation(push-pins, voorzien van een cijfer), dus je moet iets aan te boren op - en dan zal je kaart afgevaardigde een evenement bijvoorbeeld ontvangen.

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

antwoordde op 18/09/2009 om 09:31
bron van user

stemmen
0

mijn 2 cent voor 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()
        }
    }
}

het werkt. maar eerlijk gezegd kan breken als apple verandert lagen van standpunten. Beter een herkenner.

antwoordde op 16/09/2019 om 19:19
bron van user

stemmen
0

Niets wat ik ooit gevonden bewerkt, maar ik kwam met dit unperfect oplossing: In viewDidLoad

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

In afgevaardigde:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return touch.view!.frame.equalTo(mapView.frame)
}
antwoordde op 20/09/2017 om 09:34
bron van user

stemmen
0

Voeg gewoon wat code snippet als illustratie van @ tt-kilew antwoord. In mijn geval wil ik de gebruiker naar zichzelf op de kaart, maar wil niet te zijn drag aanraking te onderbreken.

@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
antwoordde op 07/04/2017 om 13:59
bron van user

stemmen
0

Kun je ook niet op dit moment onderscheppen raakt op een kaart te bekijken, kunt u proberen gelaagdheid een ondoorzichtige uitzicht op daar en kijk of het pikt raakt ...

antwoordde op 14/08/2009 om 03:59
bron van user

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