Jak mohu zjistit jediným klepnutím na instanci MKMapView? Musím podtřídy MKMapViewa pak přepsat touchesEndedmetodu?
Dík,
-Chris
Jak mohu zjistit jediným klepnutím na instanci MKMapView? Musím podtřídy MKMapViewa pak přepsat touchesEndedmetodu?
Dík,
-Chris
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.
Doufám, že to pomůže: Jak zachytit znečistit událostí na MKMapView nebo UIWebView objektů?
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 ...
}
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
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í.
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)
}
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
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 ...