UIButton в представлении аннотаций — Как сохранить значок и кнопку

#swift #mapkit #mkannotationview #mapkitannotation

Вопрос:

Мне нужна помощь с аннотацией. Что я собираюсь сделать, так это уже добавить значки, но когда я собираюсь нажать на значок (значок) Я хотел бы видеть кнопку в рамке вида аннотации, как на этих фотографиях: введите описание изображения здесь

После того, как я нажму на нее, я хотел бы увидеть эту белую рамку и uibutton:

введите описание изображения здесь

Я нашел способ добавить var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) , но я не могу использовать это дважды — вы можете увидеть это в моем коде.

Вот мой код:

     func znajdzSzczytyNaMapie(_ szczyty: [Szczyt]) {
      for szczyt in szczyty {
        let annotations = MKPointAnnotation()
        annotations.title = szczyt.name
        annotations.subtitle = szczyt.opis
        annotations.coordinate = CLLocationCoordinate2D(latitude:
          szczyt.lattitude, longitude: szczyt.longtitude)
        mapView.addAnnotation(annotations)
      }
    }

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard !(annotation is MKUserLocation) else { return nil }
        let annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: "MyMarker")
       // let identifier = "Gora"
       // var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) // The case is that obviously I cannot use let/var annotationView 2x times.
        let btn = UIButton(type: .detailDisclosure)
        annotationView.rightCalloutAccessoryView = btn
        switch annotation.title!! {
            case "Turbacz":
                annotationView.markerTintColor = UIColor(red: 0.86, green: 0.99, blue: 0.79, alpha: 1.00)
                annotationView.glyphImage = UIImage(named: "bald")
            case "example":
                annotationView.markerTintColor = UIColor(red: 0.80, green: 0.98, blue: 0.73, alpha: 1.00)
                annotationView.glyphImage = UIImage(named: "bear")
            default:
                annotationView.markerTintColor = UIColor.green
                annotationView.glyphImage = UIImage(named: "gora")
   } 
return annotationView
}
 

Редактировать:
Теперь у меня есть:

  func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        guard !(annotation is MKUserLocation) else { return nil }
        //let annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: "MyMarker")
        let identifier = "identifier"
        guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView else { return nil }
        let btn = UIButton(type: .detailDisclosure)
        annotationView.rightCalloutAccessoryView = btn
        switch annotation.title!! {
            case "Turbacz":
                annotationView.markerTintColor = UIColor(red: 0.86, green: 0.99, blue: 0.79, alpha: 1.00)
                annotationView.glyphImage = UIImage(named: "bald")
            case "example":
                annotationView.markerTintColor = UIColor(red: 0.80, green: 0.98, blue: 0.73, alpha: 1.00)
                annotationView.glyphImage = UIImage(named: "bear")
            default:
                annotationView.markerTintColor = UIColor.green
                annotationView.glyphImage = UIImage(named: "gora")
   } 
return annotationView
}
 

но вместо моих значков (см. Первое изображение в этой теме) и кнопки он показывает пользовательский значок аннотации без представления кнопки:

введите описание изображения здесь

Комментарии:

1. ОК. Так в чем же проблема?

2. @Desdenova Я обновил свой пост, это было непонятно, извините.

3. Тот, который вы прокомментировали, — это правильный путь. Не создание экземпляра вручную. Но сначала вам нужно зарегистрировать свой идентификатор в register(_:forAnnotationViewWithReuseIdentifier:)

4. @Desdenova спасибо, но когда я использую тот, который я прокомментировал, я получаю Value of type 'MKAnnotationView?' has no member 'glyphImage и Value of type 'MKAnnotationView?' has no member 'markerTintColor' и annotationView.rightCalloutAccessoryView = btn - alue of optional type 'MKAnnotationView?' must be unwrapped to refer to member 'rightCalloutAccessoryView' of wrapped base type 'MKAnnotationView'

5. Можете ли вы обновить вопрос со всем последним кодом и новыми проблемами, чтобы мы попытались помочь оттуда? Отслеживать разговор по комментариям становится все сложнее с каждым комментарием.

Ответ №1:

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

Вместо этой строки;

 guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as? MKMarkerAnnotationView else { return nil }
 

Попробуйте это, обратите внимание на дополнительную for: annotation часть;

 guard let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier, for: annotation) as? MKMarkerAnnotationView else { return nil }
 

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

Добавьте нижеприведенную строку кода, прежде чем звонить func znajdzSzczytyNaMapie(_ szczyty: [Szczyt])

 mapView.register(MKMarkerAnnotationView.self, forAnnotationViewWithReuseIdentifier: "identifier")
 

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

Комментарии:

1. Привет, когда я пытаюсь добавить mapView.register(MKMarkerAnnotationView.self, forAnnotationViewWithReuseIdentifier: "identifier") это заставляет меня 6 ошибок : последовательный объявления в строке должны быть разделены ‘;’ ; ожидается ‘(‘ в списке аргументов функции декларации; ожидается ‘{‘ в теле функции декларации ; ожидается ‘изм’ ключевое слово в метод экземпляра декларации ; признано недействительным повторное объявление ‘положение()’

2. Похоже, вы ставите не в то место. Попробуйте добавить его, viewDidLoad но прежде чем добавлять аннотации к карте.

3. Да, я уже сделал это — теперь сборка выглядит нормально, но все равно я вижу только старое представление аннотаций: imgur.com/a/9g0k2Bu

4. Я попробовал пару вещей, но у меня ничего не получилось.

5. Понимаю, спасибо вам !