#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. Понимаю, спасибо вам !