Пользовательский вызов MKMapView не отвечает на сенсорные события - PullRequest
2 голосов
/ 23 декабря 2011

У меня есть пользовательский UIView, который отображается как выноска, когда пользователь нажимает пользовательскую аннотацию на MKMapView.

Чтобы достичь этого, я подклассифицировал MKAnnotationView и перегрузил метод -setSelected:selected animated:, как предложено в этого ответа .По сути, я добавляю свой пользовательский вид как подпредставление моего подкласса MKAnnotationView.

Проблема в том, что я вообще не могу взаимодействовать с выноской, которая содержит кнопку и прокручиваемое веб-представление.Более того, если выноска скрывает аннотацию, и я нажимаю выноску в приблизительном месте этой скрытой аннотации, выноска будет отклонена, и будет показана новая.

// TPMapAnnotationView.m
@implementation TPMapAnnotationView
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    if(selected)
    {
        TPMapAnnotation* anno = ((TPMapAnnotation*)self.annotation);
        QuickInfoView* qi = [[QuickTabView alloc] initWithFrame:CGRectMake(0, 0, 440, 300)];
        [qi displayDataForAnnotation:anno];
        [self addSubview:qi];
        // some animiation code that doesn't change things either way
    }
    else
    {
        [[self.subviews objectAtIndex:0] removeFromSuperview];
    }
}

Приведенный ниже код создаетTPMapAnnotationView.

// this is in the view controller that contains the MKMapView
- (MKAnnotationView *) mapView:(MKMapView *) mapView viewForAnnotation:(id) annotation 
{  
    if ([annotation isKindOfClass:[TPMapAnnotation class]])
    {
        TPMapAnnotationView *customAnnotationView = (TPMapAnnotationView *)[myMap dequeueReusableAnnotationViewWithIdentifier:@"TPAnn"];
        if (customAnnotationView == nil)
        {
            customAnnotationView = [[TPMapAnnotationView alloc] initWithAnnotation:annotation 
                                                                reuseIdentifier:@"TPAnn"];
        }
        [customAnnotationView setImage:annotationImage];
        return customAnnotationView;
    }
    return nil; // blue radar circle for MKUserLocation class.
}

Ответы [ 2 ]

6 голосов
/ 06 января 2012

Это хорошо известная проблема. Все, что вы добавляете в AnnotationView, не обнаруживает прикосновения. Для этой проблемы есть хороший проект с открытым исходным кодом. http://dev.tuyennguyen.ca/wp-content/uploads/2011/03/CustomMapAnnotationBlogPart1.zip, http://dev.tuyennguyen.ca/wp-content/uploads/2011/03/CustomMapAnnotationBlogPart21.zip

EDIT:

Да. Я также изо всех сил пытался добавить uibuttons в свой собственный пользовательский annotationView, но потом наткнулся на этот проект и обнаружил, что его пользовательский annotationView на самом деле является аннотацией.

В любом случае, если вы хотите изменить высоту annotatioView, вы можете установить

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{

 calloutMapAnnotationView.contentHeight = height;
 calloutMapAnnotationView.titleHeight = 25;
}

здесь titleHeight - это свойство, добавленное в CalloutMapAnnotationView, которое определяет высоту «блеска» в drawRectMethod

- (void)drawRect:(CGRect)rect {
glossRect.size.height = self.titleHeight;
}

если у вас возникли трудности, пожалуйста, дайте мне знать.

А также ссылка на оригинальный пост блога: http://dev.tuyennguyen.ca/?p=298

5 голосов
/ 02 ноября 2012

Я решил эту проблему. Нажмите что-нибудь в CalloutView, карта не будет соприкасаться. Мой calloutview настроен как tabbleview

1 - В файле MapviewController.h вы добавите делегата: UIGestureRecognizerDelegate

2 - и в файле MapViewController.m реализует метод - (BOOL) gestRecognizer: (UIGestureRecognizer *) gestRecognizer следуетReceiveTouch: (UITouch *) touch

-В моем mapView, когда вы нажимаете 1 раз на карту, он будет идти в этом методе 3 раза. Поэтому я ограничу действие касания волей. Первое касание будет действием. - В myCalloutView есть tabbleView, если tabbleView получает касание. Это вернет ложное касание для карты, это сделает ваш tabbleview доступным. Это то же самое для вашей кнопки.

Примечание: в тесте попаданий NSlog View: будет иметь название элемента просмотра, к которому вы хотите прикоснуться. пример моего представления: isEqualToString: @ "UITableViewCellContentView"]

static int count=0;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    NSLog(@"hit test view %@",[touch view]);    
    if(count >0 && count<=2)
    {
        count++;
        count=count%2;
        return FALSE;
    }
    count++;      
    if ([[[[touch view] class] description] isEqualToString:@"UITableViewCellContentView"]) {
        return FALSE;
    }
    return TRUE;
}
...