Как создать выносной пузырь MKAnnotationView, который реагирует на прикосновения - PullRequest
3 голосов
/ 22 декабря 2011


Я пытаюсь сделать пользовательский вид аннотации способным безуспешно реагировать на прикосновения.
Благодаря этому вопросу мне удалось сделать вид аннотации близким к тому, что я хочу настроить пузырь выноскидля просмотра аннотаций? также видел это Как перехватить прикосновения и НЕ отклонить выноску? , но проблема совершенно иная. Первое, что я сделал до сих пор, это создание подкласса MKAnnotationView и переопределение -setSelected:animated: method

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
  [super setSelected:selected animated:animated];
  if(selected)
  {
    MyCallOut * callOut=[MyCallOut createMyCallOut];
    callOut.tag=555;
    [self.superview addSubview:callOut];

  }
  else
  {
    // [[self viewWithTag:555] removeFromSuperview];
    //Remove my custom CallOut
  }
}

Проблема в том, что представление карты поглощает все события касания, мой пользовательский выносок имеет две кнопки, но при нажатии их действие не вызывается.

ВВ одном из своих экспериментов я попытался добавить вид выноски в суперпредставление MKAnnotationView (mapView), пока все прокручивается, все выглядит нормально, но если я увеличиваю масштаб, выноска перемещается.

Ответы [ 2 ]

4 голосов
/ 22 декабря 2011

Вы должны добавить вид вызова аксессуаров в аннотации карты

-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation {
MKPinAnnotationView *pinView = nil; 
if(annotation != mapView.userLocation) 
{
    static NSString *defaultPinID = @"com.invasivecode.pin";
    pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
    if ( pinView == nil ) pinView = [[[MKPinAnnotationView alloc]
                                      initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];
    pinView.pinColor = MKPinAnnotationColorRed; 
    pinView.canShowCallout = YES;
    pinView.animatesDrop = YES;
    pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    return pinView;



} 
else {
    [mapView.userLocation setTitle:@"I am here"];
}
return pinView;
}

и для события клика вашего вызова

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control   
{

}
0 голосов
/ 03 января 2012

Решено, глядя по этой ссылке Пользовательские аннотации и выноски , другая сложная часть заключается в правильном способе нажатия кнопки на ложной выноске.Я управлял этой частью, создавая логическое значение, которое понимает количество аннотаций / parentAnnotation на экране и выбирает, когда оно может исчезнуть или нет. Просто нужно сделать CalloutAnnotation доступным для выбора.

...