iPhone: Detectarea Apăsați în MKMapView

voturi
19

Cum pot detecta un singur robinet pe o instanță MKMapView? Trebuie să subclasa MKMapViewși apoi suprascrie touchesEndedmetoda?

Mulțumiri,

-Chris

Întrebat 14/08/2009 la 03:22
sursa de către utilizator
În alte limbi...                            


8 răspunsuri

voturi
31

Dacă sunteți în căutarea doar pentru a obține notificat de gesturi la robinet , fără a afecta oricare din alt comportament tactil al hărții, veți dori să utilizați o UITapGestureRecognizer. Este super simplu, doar a pus într - un cod de genul asta.

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

Aceasta va apela didTapMapori de câte ori theMKMapViewprimește un gest de la robinet și toate ciupit, și gesturi sila vor funcționa în continuare așa cum au făcut -o înainte.

Publicat 31/12/2010 la 21:30
sursa de către utilizator

Publicat 10/11/2009 la 13:27
sursa de către utilizator

voturi
2

Perfect de lucru pe 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 ...
     }
Publicat 03/04/2015 la 10:46
sursa de către utilizator

voturi
2

Sau , în funcție de ceea ce încercați să faceți, să adăugați un MKAnnotation(pionezã, cu înștiințările), asa ca ai ceva să apăsați pe - și apoi a hărții delegat va primi un eveniment de ex.

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

Publicat 18/09/2009 la 09:31
sursa de către utilizator

voturi
0

2 cenți mea pentru 5.x Swit:

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()
        }
    }
}

functioneaza. dar sincer se poate rupe în cazul în care Apple a schimba straturi de opinii. mai bine un recognizer.

Publicat 16/09/2019 la 19:19
sursa de către utilizator

voturi
0

Nimic nu am găsit vreodată lucrat, dar am venit cu această soluție unperfect: În viewDidLoad

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

În delegat:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return touch.view!.frame.equalTo(mapView.frame)
}
Publicat 20/09/2017 la 09:34
sursa de către utilizator

voturi
0

Doar adăugați un fragment de cod ca ilustrare a răspunsului @ tt-kilew. În cazul meu, vreau să subliniez ca utilizatorul să se pe hartă, dar nu doresc să-și întrerupă trageți atingerea lui.

@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
Publicat 07/04/2017 la 13:59
sursa de către utilizator

voturi
0

Tu cant la acest moment de interceptare atinge pe o vizualizare hartă, puteți încerca stratificarea o vedere opacă pe acolo și a vedea dacă se ridică atinge ...

Publicat 14/08/2009 la 03:59
sursa de către utilizator

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