1

Я не могу заставить длинный идентификатор распознавания жестов работать над представлением аннотации, только с видом карты. Сокращенный вариант моего кода:Использование UILongPressGestureRecognizer для удаления MKAnnotation

@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, MKMapViewDelegate, UIGestureRecognizerDelegate, UIActionSheetDelegate> 
{ 
    CLLocationManager *locationManager; 

    // Views 
    IBOutlet MKMapView *mapView; 
    IBOutlet MKAnnotationView *annotationView; 

    UILongPressGestureRecognizer *longPress; 
} 

и части реализации в AppDelegate.m ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    locationManager = [[CLLocationManager alloc] init]; 
    [locationManager setDelegate:self]; 

    [mapView setShowsUserLocation:YES]; 

    longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self 
                 action:@selector(deleteSelectedAnnotation:)]; 

    [[self window] makeKeyAndVisible]; 
    return YES; 
} 

- (void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views 
{ 
    annotationView = [views objectAtIndex:0]; 
    [annotationView addGestureRecognizer:longPress]; 
    id <MKAnnotation> mp = [annotationView annotation]; 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 250, 250); 
    [mv setRegion:region animated:YES]; 
} 

- (IBAction)deleteSelectedAnnotation:(UIGestureRecognizer *)sender 
{ 
    if (sender.state == UIGestureRecognizerStateBegan) 
    { 
     NSLog(@"long press"); 
     UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Delete Record?" 
                   delegate:self 
                 cancelButtonTitle:nil 
                destructiveButtonTitle:nil 
                 otherButtonTitles:@"Yes",@"No",nil]; 
             [actionSheet showInView:mapView]; 
             [actionSheet release]; 
    } 
} 

Так вся эта вещь работает, если я изменить объект вида в соответствии с [annotationView addGestureRecognizer:longPress]mapView , Но я хочу, чтобы действие выполнялось только в том случае, если пользователь нажимает аннотацию, а не на карте. Что я делаю не так?

Спасибо.

ответ

0

Вы можете проверить, если сенсорный внутри границ в пояснительных в:

UIView *annotationView = [mapView viewForAnnotation:myAnnotation]; 
if (annotationView && CGRectContainsPoint(annotationView.bounds, [sender locationInView:annotationView])) 
{ 
    // we can continue 
} 
+0

Это хорошая мысль. Я смущен, хотя вы повторно использовали мое имя для annotationView как UIView. мой MKAnnotationView уже называется annotationView. Не могли бы вы это прояснить? Благодарю. –

+0

Кроме того, я предполагаю, что 'myAnnotation' является' mp' в моем коде? –

+0

Не могли бы вы ответить? Я хотел бы попытаться изучить этот вариант, но ваш ответ немного запутан. –

Смежные вопросы