Установка canShowCallOut = NO для текущей аннотации местоположения, iPhone
Я использую пользовательский вызов (название и субтитры) для текущего значка местоположения. Я попытался сделать следующее, чтобы отключить аннотацию по умолчанию, но она не работает.
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
NSLog(@"viewForAnnotation");
if ([annotation isKindOfClass:[MKUserLocation class]])
{
MKAnnotationView *userLocationView = [mapView viewForAnnotation:annotation];
userLocationView.canShowCallout = NO;
NSLog(@"[annotation isKindOfClass:[MKUserLocation class]");
return nil;
}
}
Только он работает
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)ann
{
if([ann.annotation isKindOfClass:[MKUserLocation class]] )
{
[mymap deselectAnnotation:ann.annotation animated:NO];
}
}
Но он иногда отстает. Есть ли другой способ отключить отображение выноски по умолчанию для текущей аннотации местоположения? Любая помощь будет оценена.
Ответы
Ответ 1
Для этого нужно получить ссылку на текущее местоположение MKAnnotationView
. Можно получить эту ссылку в любом месте, но лучше получить ее, как только будет определено местоположение пользователя.
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
MKAnnotationView* annotationView = [mapView viewForAnnotation:userLocation];
annotationView.canShowCallout = NO;
}
Или используйте следующий метод
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
MKAnnotationView *aV;
for (aV in views) {
if ([aV.annotation isKindOfClass:[MKUserLocation class]]) {
MKAnnotationView* annotationView = aV;
annotationView.canShowCallout = NO;
}
}
и если вы хотите изменить свойство canShowCallout во время выполнения, то можно использовать следующие
for (AnnotationClass* annotation in mapView.annotations)
{
if([annotation isKindOfClass:[MKUserLocation class]] )
{
MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation];
annotationView.canShowCallout = NO;
}
}
Ответ 2
обновление для этого, используя быстрый (на основе чата ответа):
func mapView(mapView: MKMapView!, didAddAnnotationViews views: [MKAnnotationView]!) {
for view in views {
if view.annotation.isKindOfClass(MKUserLocation) {
view.canShowCallout = false
}
}
}
Примечание. Используя это, я не требовал ничего другого, чтобы заставить его работать
Ответ 3
Swift:
Это сработало для меня: просто добавьте этот метод делегата.
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
for var view in views {
view.canShowCallout = false
}
}
Ответ 4
Это работало для меня на Swift 3.0/iOS 10.
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
(views.filter { $0.isKind(of: MKUserLocation.self) }).first?.canShowCallout = false
}
Вместо того, чтобы перебирать все представления, я просто полагаюсь на команду filter
, за которой следует опциональный вызов сначала, поскольку должно быть только одно местоположение, а затем установить значение в false.
Ответ 5
// Objective-C
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
MKAnnotationView *userLocationView = [mapView viewForAnnotation:userLocation];
userLocationView.canShowCallout = NO;
}
// Swift 4.2
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
let userAnnotationView = mapView.view(for: userLocation)
userAnnotationView?.canShowCallout = false
}
Ответ 6
ИЗМЕНИТЬ
Извините за то, что вы ошибаетесь.
Я ударился головой об этом.
Это единственный способ, которым я это сделал. проблема с этим методом заключается в том, что вам нужно изменить представление UserLocation. Так что это может быть не так удобно.
В любом случае:
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
if ([annotation isKindOfClass:[MKUserLocation class]]){
MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
annotationView.image = [UIImage imageNamed:@"your-icon.png"];
annotationView.enabled=NO;
return annotationView;
};
........}
Имейте, чтобы бежать к детскому саду, чтобы взять моего ребенка:)
Удачи.