2010-10-18 11 views

Odpowiedz

190

Można użyć UILongPressGestureRecognizer do tego. Gdziekolwiek utworzyć lub zainicjować MapView najpierw dołączyć do niego rozpoznawania:

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handleLongPress:)]; 
lpgr.minimumPressDuration = 2.0; //user needs to press for 2 seconds 
[self.mapView addGestureRecognizer:lpgr]; 
[lpgr release]; 

Następnie w programie obsługi gestów:

- (void)handleLongPress:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan) 
     return; 

    CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView]; 
    CLLocationCoordinate2D touchMapCoordinate = 
     [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView]; 

    YourMKAnnotationClass *annot = [[YourMKAnnotationClass alloc] init]; 
    annot.coordinate = touchMapCoordinate; 
    [self.mapView addAnnotation:annot]; 
    [annot release]; 
} 

YourMKAnnotationClass jest klasą zdefiniować, że jest zgodny z protokołem MKAnnotation. Jeśli Twoja aplikacja będzie działać tylko w systemie iOS 4.0 lub nowszym, możesz zamiast tego użyć predefiniowanej klasy MKPointAnnotation.

Przykłady na temat tworzenia własnej klasy MKAnnotation można znaleźć w przykładowych aplikacjach WeatherMap i MapCallouts.

+0

Dziękuję, że to działa –

+6

Niesamowite odpowiedź, dzięki. Osobiście zamieniłem instrukcję if na '==', więc ona zwraca, jeśli * nie jest * 'UIGestureRecognizerStateBegan'. Wykonanie tej czynności spowoduje usunięcie kodu PIN po określonym czasie, nawet jeśli użytkownik nadal trzyma mapę, która była dla mnie pożądana (i jak działa oficjalna aplikacja Mapy). –

+0

Chciałbym tylko powiedzieć, że zaimplementowałem twoją odpowiedź w moim projekcie i działa jak czar. Dziękuję za najdoskonalszą odpowiedź. – DoubleDunk

32

Dziękuję Annie za udzielenie tak wspaniałej odpowiedzi! Oto wersja Swift, jeśli ktokolwiek jest zainteresowany (odpowiedź została zaktualizowana do składni Swift 3.0).

Tworzenie UILongPressGestureRecognizer:

let longPressRecogniser = UILongPressGestureRecognizer(target: self, action: #selector(MapViewController.handleLongPress(_:))) 
longPressRecogniser.minimumPressDuration = 1.0 
mapView.addGestureRecognizer(longPressRecogniser) 

Handling gest:

func handleLongPress(_ gestureRecognizer : UIGestureRecognizer){ 
    if gestureRecognizer.state != .began { return } 

    let touchPoint = gestureRecognizer.location(in: mapView) 
    let touchMapCoordinate = mapView.convert(touchPoint, toCoordinateFrom: mapView) 

    let album = Album(coordinate: touchMapCoordinate, context: sharedContext) 

    mapView.addAnnotation(album) 
} 
+0

Wow ... Nie zauważyłem tego i spędziłem dużo czasu na konwersji. –

+2

Możliwe jest użycie _ ** let longPressRecogniser = UILongPressGestureRecognizer (target: self, action: "handleLongPress:") ** _ –

+0

@Dx_ tak możesz, ponieważ program rozpoznający nie jest modyfikowany. Właściwości w kamerze są modyfikowane. – 3366784

Powiązane problemy