Как удалить все аннотации из MKMapView, кроме аннотации местоположения пользователя?
Я использую removeAnnotations
удалить мои аннотации из mapView
но то же самое он удаляет пользовательское местоположение ann. Как я могу предотвратить это или как вернуть пользователя ann для просмотра?
NSArray *annotationsOnMap = mapView.annotations;
[mapView removeAnnotations:annotationsOnMap];
7 ответов
Обновить:
Когда я попробовал с iOS 9 SDK, пользовательская аннотация больше не удалялась. Вы можете просто использовать
mapView.removeAnnotations(mapView.annotations)
Исторический ответ (для приложений, которые работают на iOS до iOS 9):
Попробуй это:
NSMutableArray * annotationsToRemove = [ mapView.annotations mutableCopy ] ;
[ annotationsToRemove removeObject:mapView.userLocation ] ;
[ mapView removeAnnotations:annotationsToRemove ] ;
РЕДАКТИРОВАТЬ: Swift версия
let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
mapView.removeAnnotations( annotationsToRemove )
Чтобы удалить все аннотации с карты:
[self.mapView removeAnnotations:[self.mapView annotations]];
Чтобы удалить указанные аннотации из Mapview
for (id <MKAnnotation> annotation in self.mapView.annotations)
{
if (![annotation isKindOfClass:[MKUserLocation class]])
{
[self.mapView removeAnnotation:annotation];
}
}
Надеюсь, это поможет вам.
Для Swift вы можете просто использовать однострочник:
mapView.removeAnnotations(mapView.annotations)
Редактировать: как упоминал nielsbot, он также удалит аннотацию местоположения пользователя, если вы не настроили ее так:
mapView.showsUserLocation = true
Если ваше местоположение пользователя является своего рода классом MKUserLocation
использовать isKindOfClass
чтобы избежать удаления пользовательской аннотации.
if (![annotation isKindOfClass:[MKUserLocation class]]) {
}
В противном случае вы можете установить флаг, чтобы распознать ваши аннотации в – mapView:viewForAnnotation:
,
Swift 4.2 или новее
Добавьте эту строку перед добавлением аннотаций
mapView.removeAnnotations(mapView.annotations.filter { $0 !== mapView.userLocation })
В Swift 4.1:
Обычно, если вы не хотите удалять аннотацию MKUserLocation, вы можете просто запустить:
self.mapView.removeAnnotations(self.annotations)
,
Этот метод по умолчанию не удаляет аннотацию MKUserLocation из annotations
список.
Однако, если вам нужно отфильтровать все аннотации, кроме MKUserLocation (см. annotationsNoUserLocation
переменная ниже) по любой другой причине, например, для центрирования всех аннотаций, кроме аннотации MKUserLocation, вы можете использовать это простое расширение ниже.
extension MKMapView {
var annotationsNoUserLocation : [MKAnnotation] {
get {
return self.annotations.filter{ !($0 is MKUserLocation) }
}
}
func showAllAnnotations() {
self.showAnnotations(self.annotations, animated: true)
}
func removeAllAnnotations() {
self.removeAnnotations(self.annotations)
}
func showAllAnnotationsNoUserLocation() {
self.showAnnotations(self.annotationsNoUserLocation, animated: true)
}
}
Как насчет некоторых NSPredicate
фильтр?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"className != %@", NSStringFromClass(MKUserLocation.class)];
NSArray *nonUserAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:predicate];
[self.mapView removeAnnotations:nonUserAnnotations];
Жизнь всегда лучше с фильтром NSPredicate
Привет, попробуйте это, я получил решение из этого кода:
NSMutableArray*listRemoveAnnotations = [[NSMutableArray alloc] init];
[Mapview removeAnnotations:listRemoveAnnotations];
[listRemoveAnnotations release];