Пользовательский вызов MKMapView не отвечает на сенсорные события

У меня есть обычай 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 ответа

Решение

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

EDIT:

Да. Я также изо всех сил пытался добавить uibutton в свой собственный пользовательский 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

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

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

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

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

Примечание: в NSlog Hit Test 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;
}
Другие вопросы по тегам