Пользовательский вызов 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;
}