iPad Mapkit - изменить название «Текущее местоположение» - PullRequest
7 голосов
/ 01 декабря 2010

В режиме карты я показываю текущее местоположение пользователя.При нажатии на значок булавки отображается «Текущее местоположение».Я хочу изменить его на «Мое текущее местоположение».Как я могу это изменить.Также я хочу изменить цвет булавки текущего местоположения пользователя в таймере.Некоторые вещи, например, каждую секунду, должны менять цвет на зеленый, фиолетовый и красный.Возможно ли это сделать?

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

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation{
static NSString *AnnotationViewID = @"annotationViewID";
SolarAnnotationView* annotationView = (SolarAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
if(annotationView == nil)
{
    if([self CLLocationCoordinate2DEquals:mapView.userLocation.location.coordinate withSecondCoordinate:[annotation coordinate]]) //Show current location with green pin
    {
        annotationView = [[SolarAnnotationView alloc] initWithAnnotation:annotation];
        annotationView.delegate = self;
        [annotationView setPinColor:MKPinAnnotationColorGreen];
    }
    else
    {
        annotationView = [[SolarAnnotationView alloc] initWithAnnotation:annotation];
        annotationView.delegate = self;
    }
}   

return annotationView;

}

- (BOOL) CLLocationCoordinate2DEquals:(const CLLocationCoordinate2D)lhs withSecondCoordinate:(const CLLocationCoordinate2D) rhs{
const CLLocationDegrees DELTA = 0.001;
return fabs(lhs.latitude - rhs.latitude) <= DELTA && fabs(lhs.longitude - rhs.longitude) <= DELTA;

}

1 Ответ

20 голосов
/ 01 декабря 2010

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

ЕслиВы должны показать местоположение пользователя, используя изображение булавки вместо синей точки, затем требуется дополнительная работа.

Сначала простой способ с использованием синей точки:

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        ((MKUserLocation *)annotation).title = @"My Current Location";
        return nil;  //return nil to use default blue dot view
    }

    //Your existing code for viewForAnnotation here (with some corrections)...
    static NSString *AnnotationViewID = @"annotationViewID";
    SolarAnnotationView* annotationView = (SolarAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
    if(annotationView == nil)
    {
        {
            annotationView = [[[SolarAnnotationView alloc] initWithAnnotation:annotation] autorelease];
            //added autorelease above to avoid memory leak
            annotationView.delegate = self;
        }
    }

    //update annotation in view in case we are re-using a view
    annotationView.annotation = annotation;

    return annotationView;
}

Если вы хотите использовать вместо этого пользовательский вид аннотации для местоположения пользователя, вы должны поместить код изменения цвета булавки в пользовательский вид.Один из способов периодически менять цвет - использовать executeSelector: withObject: afterDelay :.В SolarAnnotationView.m добавьте эти два метода:

-(void)startChangingPinColor
{
    switch (self.pinColor) {
        case MKPinAnnotationColorRed:
            self.pinColor = MKPinAnnotationColorGreen;
            break;
        case MKPinAnnotationColorGreen:
            self.pinColor = MKPinAnnotationColorPurple;
            break;
        default:
            self.pinColor = MKPinAnnotationColorRed;
            break;
    }
    [self performSelector:@selector(startChangingPinColor) withObject:nil afterDelay:1.0];
}

-(void)stopChangingPinColor
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
}

Также добавьте заголовки методов в файл SolarAnnotationView.h.

Затем измените метод viewForAnnotation следующим образом:

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation{
    static NSString *AnnotationViewID = @"annotationViewID";
    SolarAnnotationView* annotationView = (SolarAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
    if(annotationView == nil)
    {
        {
            annotationView = [[[SolarAnnotationView alloc] initWithAnnotation:annotation] autorelease];
            annotationView.delegate = self;
        }
    }

    //Update annotation in view in case we are re-using a view...
    annotationView.annotation = annotation;

    //Stop pin color changing in case we are re-using a view that has it on
    //and this annotation is not user location...
    [annotationView stopChangingPinColor];

    if([self CLLocationCoordinate2DEquals:mapView.userLocation.location.coordinate withSecondCoordinate:[annotation coordinate]]) //Show current location with green pin
    {
        [annotationView setPinColor:MKPinAnnotationColorGreen];
        annotationView.canShowCallout = YES;
        ((MKPointAnnotation *)annotation).title = @"My Current Location";
        [annotationView startChangingPinColor];
    }

    return annotationView;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...