ios mapkit закрывает аннотации, нажимая на карту - PullRequest
6 голосов
/ 23 июня 2011

У меня есть приложение mapkit, которое помещает аннотации на карту, при нажатии на них отображается выноска с атрибутом title.

Это работает нормально, но пользователь не может их закрыть.Они остаются открытыми, пока не нажмут другую аннотацию.Не могу ли я сделать так, чтобы пользователь мог нажать еще где-то на карте (или снова нажать аннотацию), чтобы закрыть ее?

У меня было ощущение, что это настройка по умолчанию, так что, может быть, что-то, что я делаю, это заполняю?У меня есть распознаватель жестов, который я использую для обнаружения некоторых нажатий на карту

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleTap:)];
tap.numberOfTapsRequired = 1;

[self.mapView addGestureRecognizer: tap];

, который запускает это:

- (void)handleTap:(UITapGestureRecognizer *)sender {     
if (sender.state == UIGestureRecognizerStateEnded)  {   


    CGPoint tapPoint = [sender locationInView:sender.view.superview];
    CLLocationCoordinate2D coordinate = [self.mapView convertPoint: tapPoint toCoordinateFromView: self.mapView];

    if (pitStopMode && !pitStopMade){
            pitStopMade = YES;
        InfoAnnotation *annotation = [[InfoAnnotation alloc]
                       initNewPitstopWithCoordinate:coordinate];
        NSLog(@" Created Pit Stop");

        annotation.draggable = NO;
        //place it on the map
        [self.mapView addAnnotation: annotation];

        self.instructionLabel.text = @"Tap button again to remove";
        annotation.creatorId = self.localUser.deviceId;
        //send it to the server
        [annotation updateLocationWithServerForConvoy: self.convoyCode];        

        [annotation release];

    }  

    if (hazardMode && !hazardMade){
            hazardMade = YES;
        InfoAnnotation *annotation  = [[InfoAnnotation alloc]
                       initNewHazardWithCoordinate:coordinate];         
        NSLog(@" Created Hazard");

        annotation.draggable = NO;
        //place it on the map
        [self.mapView addAnnotation: annotation];

        self.instructionLabel.text = @"Tap button again to remove";
        annotation.creatorId = self.localUser.deviceId;
        //send it to the server
        [annotation updateLocationWithServerForConvoy: self.convoyCode];        

        [annotation release];


    }
}

}

Есть ли что-то, что мне нужно сделатьтакже позволить этим кранам перейти к просмотру карты?Перетаскивание аннотаций работает хорошо, хотя, поэтому я не уверен, что это является причиной этого?

есть ли опция, которую я пропускаю, или мне нужно попробовать реализовать это вручную?

Ответы [ 2 ]

10 голосов
/ 23 июня 2011

Вы можете реализовать метод UIGestureRecognizerDelegate gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: и вернуть YES (поэтому собственный распознаватель жестов касания представления карты также выполнит свой метод).

Во-первых,добавьте объявление протокола в интерфейс вашего контроллера представления (чтобы избежать предупреждения компилятора):

@interface MyViewController : UIViewController <UIGestureRecognizerDelegate>

Далее установите свойство delegate в распознавателе жестов:

tap.delegate = self;

Наконец,реализовать метод:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:
        (UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}



Если по какой-то причине это не сработает, вы можете альтернативно отменить выбор любой выбранной в данный момент аннотации вручную в верхней части метода handleTap::

for (id<MKAnnotation> ann in mapView.selectedAnnotations) {
    [mapView deselectAnnotation:ann animated:NO];
}

Несмотря на то, что в представлении карты одновременно может быть выбрано не более одной аннотации, свойство selectedAnnotations имеет значение NSArray, поэтому мы перебираем его.

0 голосов
/ 28 марта 2014

Анна, объясни хорошо. Также я хочу объяснить с помощью именно кода. Вы можете сделать это

     UITapGestureRecognizer *tapMap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeCallout:)];
      [self.mapView addGestureRecognizer:tapMap];

-(void) closeCallout:(UIGestureRecognizer*) recognizer 
        {
           for (id<MKAnnotation> ann in mapView.selectedAnnotations) 
           {
               [mapView deselectAnnotation:ann animated:NO];
           }      


        }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...