Как создать выносной пузырь MKAnnotationView, который реагирует на прикосновения
Я пытаюсь сделать пользовательский вид аннотации способным отвечать на прикосновения без успеха.
Благодаря этому вопросу мне удалось сделать аннотацию, близкую к тому, что я хочу, чтобы настроить пузырь выноски для аннотации? также видел это, как захватить прикосновения и не отклонить выноску? но проблема совсем в другом Первое, что я сделал на данный момент, это создание подкласса MKAnnotationView и переопределение -setSelected:animated: метод
- (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 ответа
Вы должны добавить внешний вид вызова в аннотации карты
-(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
{
}
Решив поиск по этой ссылке Пользовательские аннотации и выноски, другая сложная часть заключается в правильном способе нажатия кнопки на ложной выноске. Я управлял этой частью, создавая логическое значение, которое понимает количество аннотаций /parentAnnotation на экране и выбирает, когда оно может исчезнуть или нет. Просто нужно сделать CalloutAnnotation доступным для выбора.