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

Можем ли мы иметь пользовательский вид аннотации для текущего местоположения пользователей в iOS?

Мне нужно удалить синюю точку (с кругами) с помощью моего собственного пользовательского представления (скажем, какой-нибудь пин-пин). Можно ли сделать это?

Если мы это сделаем, этот пин-код перемещается в новое местоположение, когда происходит изменение в местоположении пользователя? Или нам нужно обрабатывать это программно?

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

Я просто хочу знать, можно ли это сделать с помощью нашего собственного пользовательского представления.

2 ответа

Решение

Да, вы можете иметь пользовательский вид для местоположения пользователя.

К сожалению, это сложнее реализовать, чем должно быть, потому что, хотя документация для метода делегата viewForAnnotation утверждает, что вы можете просто предоставить свое собственное представление, если класс аннотации MKUserLocation пользовательский вид не продолжает перемещаться вместе с местоположением пользователя. На самом деле, когда пользовательский вид возвращается для MKUserLocation, представление карты перестает полностью обновлять местоположение пользователя (представление карты didUpdateUserLocation метод делегата больше не срабатывает). Я считаю, что это ошибка.

Обходной путь должен использовать CLLocationManager и пользовательская аннотация...


Удостовериться showsUserLocation является NO или не отмечен в представлении карты.

Объявите свойства для CLLocationManager и пользовательская аннотация с использованием пользовательского класса, который реализует MKAnnotation протокол (или вы могли бы просто использовать общий MKPointAnnotation учебный класс).

В viewDidLoad или другое подходящее место, создайте CLLocationManager установите его delegate и позвонить startUpdatingLocation,

В локации менеджера didUpdateToLocation метод делегата (не вид карты didUpdateUserLocation делегировать метод), создайте или обновите пользовательскую аннотацию:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    if (myUserLocAnnot == nil)
    {
        self.myUserLocAnnot = [[[MyUserLocClass alloc] init] autorelease];
          //remove the autorelease if using ARC
        myUserLocAnnot.title = @"You are here";
        myUserLocAnnot.coordinate = newLocation.coordinate;
        [mapView addAnnotation:myUserLocAnnot];
    }
    else
    {
        myUserLocAnnot.coordinate = newLocation.coordinate;
    }
}

Наконец, в представлении карты viewForAnnotation метод делегата, вы бы возвращали пользовательское представление аннотации, если аннотация является вашей пользовательской аннотацией местоположения пользователя.

Вот ответ в 2021 году.

Свифт 5, XCode 12.

      if annotation.isKind(of: MKUserLocation.self) {
            let userIdentifier = "user_location"
            
            if let existingView = mapView
              .dequeueReusableAnnotationView(withIdentifier: userIdentifier) {
              return existingView
            } else {
              let view = MKAnnotationView(annotation: annotation, reuseIdentifier: userIdentifier)
              view.image = #imageLiteral(resourceName: "dark_haulerIcon")
              return view
            }
            
        }

И вам не нужно писать логику для перемещения аннотации. Давай, это будет сделано автоматически. Просто используйте приведенную выше логику.

Другие вопросы по тегам