Hoe kan ik detecteren een enkele tik op een exemplaar van MKMapView? Moet ik subklasse MKMapViewen overschrijven de touchesEndedmethode?
Bedankt,
-Chris
Hoe kan ik detecteren een enkele tik op een exemplaar van MKMapView? Moet ik subklasse MKMapViewen overschrijven de touchesEndedmethode?
Bedankt,
-Chris
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.
Hoop dat dit zal helpen: Hoe te onderscheppen raakt evenementen op een MKMapView of UIWebView voorwerpen?
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 ...
}
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
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.
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)
}
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
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 ...