iPhone: Oppdager Tap i MKMapView

stemmer
20

Hvordan jeg oppdage et enkelt trykk gjør på en forekomst av MKMapView? Må jeg underklasse MKMapViewog deretter overstyre touchesEndedmetoden?

Takk,

-Chris

Publisert på 14/08/2009 klokken 02:22
kilden bruker
På andre språk...                            


8 svar

stemmer
31

Hvis du bare ønsker å bli varslet av trykk gester uten å påvirke noen av de andre berøring oppførsel av kartet, vil du ønsker å bruke en UITapGestureRecognizer. Det er super enkelt, bare legge på noen kode som dette.

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

Det vil ringe didTapMapnår theMKMapViewmottar en kran gest og all klemming og dra gester vil fortsatt fungere som de gjorde før.

Svarte 31/12/2010 kl. 20:30
kilden bruker

Svarte 10/11/2009 kl. 12:27
kilden bruker

stemmer
2

Fungerer perfekt på 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 ...
     }
Svarte 03/04/2015 kl. 10:46
kilden bruker

stemmer
2

Eller avhengig av hva du prøver å gjøre, legge til en MKAnnotation(knappenålen, med en bildeforklaring), slik at du har noe å trykke på - og deretter kartet delegat vil motta en hendelse f.eks.

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

Svarte 18/09/2009 kl. 08:31
kilden bruker

stemmer
0

mine 2 cent for bytte; 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()
        }
    }
}

det fungerer. men ærlig talt kan bryte Hvis Apple endrer lag med utsikt. bedre en gjenkjenner.

Svarte 16/09/2019 kl. 19:19
kilden bruker

stemmer
0

Ingenting jeg noen gang funnet arbeidet, men jeg kom opp med denne unperfect løsning: I viewDidLoad

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

I delegat:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    return touch.view!.frame.equalTo(mapView.frame)
}
Svarte 20/09/2017 kl. 09:34
kilden bruker

stemmer
0

Bare legge til noen kodebiten som illustrasjon av @ tt-kilew svar. I mitt tilfelle, jeg ønsker å påpeke at brukeren selv på kartet, men ønsker ikke å avbryte sin dra touch.

@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
Svarte 07/04/2017 kl. 13:59
kilden bruker

stemmer
0

Du kan ikke på dette tidspunktet skjærings berører et kartutsnitt, kan du prøve lagdeling en ugjennomsiktig syn på det og se om det tar seg opp berører ...

Svarte 14/08/2009 kl. 02:59
kilden bruker

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