2011-12-23 5 views
2

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

Для этого я подклассифицировал MKAnnotationView и перегрузил метод -setSelected:selected animated:, как предлагается в this answer. В основном, я добавляю свой пользовательский просмотр в качестве подзаголовка моего подкласса 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. 
} 
+0

ли 'userInteractionEnabled' свойство вашего' MKAnnotationView' установлено в 'YES'? – mattjgalloway

+0

Да, это значение 'YES'. – dandan78

+0

Есть ли шанс, что вы можете опубликовать код для создания вашего подкласса «MKAnnotationView»? – mattjgalloway

ответ

5

Это хорошо известная проблема. Все, что вы добавите в 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 в свой собственный аннотационный просмотр, но затем я наткнулся на этот проект и обнаружил, что его пользовательский аннотационный просмотр на самом деле является аннотацией.

В любом случае, если вы хотите изменить высоту 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; 
} 

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

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

+0

Я в конце концов пошел с модификацией этого кода. Это была небольшая работа, потому что мне потребовалось некоторое время, чтобы понять, что выноска на самом деле представляет собой аннотацию на заказ. Кроме того, код чертежа является немного загадочным и обычно трудно модифицировать. – dandan78

+0

@ dandan78 см. Обновление – chatur

+0

Спасибо, чатур, но мне удалось заставить его работать неделю назад. Я просто указывал, что код был немного сложнее переделать. Во всяком случае, мой случай был несколько более сложным, поэтому мне пришлось погрузиться в «drawRect» и другой код рисования. Это было, конечно, легче, чем начинать с нуля, но опять же, не совсем прогуляться в парке. – dandan78

5

Я решил эту проблему. Нажмите что-нибудь в CalloutView, карта не получит touch.My calloutview на заказ имеют tabbleview

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

2 - и в файле MapViewController.m реализации метода - (BOOL) gestureRecognizer: (UIGestureRecognizer *) gestureRecognizer shouldReceiveTouch: (UITouch *) touch

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

Примечание: в тесте NSlog hit Вид: будет иметь имя объекта вида, который вы хотите, чтобы он касался. пример мой взгляд: 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; 
} 
+1

Где распознаватель жестов? .delegate = self – k06a

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