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
}