MKUserLocation выбирается, ложно перехватывая прикосновения из пользовательских представлений MKAnnotation.

У меня есть карта нормалей в моем приложении для iOS, в которой включена функция "Показывать местоположение пользователей" - это означает, что у меня есть нормальная синяя точка на карте, показывающая мою позицию и информацию о точности. Выноска отключена в коде.

Но у меня также есть пользовательские MKAnnotationViews, которые наносятся на карту, и все они имеют собственные выноски.

Это работает нормально, но проблема в том, что когда мое местоположение находится в местоположении MKAnnotationView, синяя точка (MKUserLocation) перехватывает касание, поэтому MKAnnotationView не затрагивается.

Как я могу отключить взаимодействие пользователя с синей точкой, чтобы касания перехватывались MKAnnotationViews, а не синей точкой?

Это то, что я делаю до сих пор:

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation;
{
    if (annotation == self.mapView.userLocation)
    {
        [self.mapView viewForAnnotation:annotation].canShowCallout = NO;
        return [self.mapView viewForAnnotation:annotation];
    } else {
        ...
    }
}

2 ответа

Отключение выноски не отключает прикосновения к представлению (didSelectAnnotationView все равно будет звонить).

Чтобы отключить взаимодействие с пользователем в представлении аннотации, установите его enabled собственность на NO,

Однако вместо настройки enabled в NO в viewForAnnotation метод делегата, я предлагаю сделать это в didAddAnnotationViews метод делегата вместо и в viewForAnnotationпросто вернись nil за MKUserLocation,

Пример:

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation;
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        return nil;
    }

    //create annotation view for your annotation here...
}

-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
    MKAnnotationView *av = [mapView viewForAnnotation:mapView.userLocation];
    av.enabled = NO;  //disable touch on user location
}

Swift 4.2 Пример:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation)   ->     MKAnnotationView? {
    if annotation is MKUserLocation {
        return nil
    }
// Add custom annotation views here.
}

func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView])      {
    // Grab the user location annotation from your IB Outlet map view.
    let userLocation = mapView.view(for: mapView.userLocation)
    userLocation?.isEnabled = false
}
Другие вопросы по тегам