MKUserLocation Custom View не движется! - PullRequest
7 голосов
/ 24 апреля 2011

Я создал пользовательский MKAnnotationView для расположения пользователя:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

{

if ([annotation isKindOfClass:[MKUserLocation class]]) {

    if (navStatus == NavStatusHeadingEnabled) {

        if ([annotation isKindOfClass:[MKUserLocation class]]) {

            locationView = [[CustomLocationView alloc] initWithAnnotation:annotation reuseIdentifier:@"locationIdentifier"];
            return locationView;

        }

    }

    return nil;

}

CustomLocationView.h

       - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
    {
        self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
        if (self != nil)
        {


            self.backgroundColor = [UIColor clearColor];
            blueDot = [UIImage imageNamed:@"userLocationDot.png"].CGImage;
            CGImageRetain(blueDot);

            CGPoint blueDotCenter = CGPointMake((self.frame.size.width - (CGImageGetWidth(blueDot) / 2)) / 2, (self.frame.size.height - (CGImageGetHeight(blueDot) / 2)) / 2);

            blueDotLayer = [CALayer layer];
            blueDotLayer.frame = CGRectMake(blueDotCenter.x, blueDotCenter.y , CGImageGetWidth(blueDot) / 2, CGImageGetHeight(blueDot) / 2);
            blueDotLayer.contents = (id)blueDot;
            blueDotLayer.shadowOpacity = 0.4;
            blueDotLayer.shadowColor = [UIColor blackColor].CGColor;
            blueDotLayer.shadowOffset = CGSizeMake(0.4, 0.3);
            blueDotLayer.shadowRadius = 1.0f;

            [self.layer insertSublayer:blueDotLayer above:self.layer];

        }

        return self;
    }

- (void)setAnnotation:(id <MKAnnotation>)annotation
{
    [super setAnnotation:annotation];

    [self setNeedsDisplay];
}





- (void)dealloc {

    [blueDotLayer release];


    [super dealloc];
}

Проблема в том, что он просто остается на том же месте и не движется, как синяя точка. Что я делаю не так?

Спасибо Билл.

Ответы [ 4 ]

5 голосов
/ 15 июля 2011

Я тоже столкнулся с этой проблемой только сейчас. Я не уверен, является ли это ожидаемым поведением или нет, но по какой-то причине мы должны переместить наши пользовательские представления аннотаций MKUserLocation.

Наивное решение

- (void) locationController: (LocationController *) locationController
        didUpdateToLocation: (CLLocation *) location
{
    [[self mapView] setShowsUserLocation:NO];

    [[self mapView] setShowsUserLocation:YES];
}

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

Еще лучше сохранить ссылку на пользовательский вид аннотации в виде ивара в контроллере вида, а затем выполнить:

- (void) locationController: (LocationController *) locationController
        didUpdateToLocation: (CLLocation *) location
{
    CGPoint newCenterPoint = [[self mapView] convertCoordinate:[location coordinate] toPointToView:[[self customAnnotationView] superview]];
    newCenterPoint.x += [[self customAnnotationView] centerOffset].x;
    newCenterPoint.y += [[self customAnnotationView] centerOffset].y;

    [UIView animateWithDuration:0.3f animations:^{
        [[self customAnnotationView] setCenter:newCenterPoint];
    }];

}

Это хорошо, за исключением того, что когда вы изменяете уровень масштабирования, аннотация остается там, где она была относительно прямоугольника вида карты, а затем анимируется в правильное положение только после завершения масштабирования или панорамирования. Лучше всего последовать примеру Apple и сделать так, чтобы аннотации текущего местоположения исчезали и появлялись вновь при изменении региона:

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    [[self mapView] setShowsUserLocation:NO];
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    [[self mapView] setShowsUserLocation:YES];
}
0 голосов
/ 05 декабря 2012

Вот ответ технической поддержки Apple Developer

Я только что закончил говорить с инженерами MapKit, и они подтвердили, что это ошибка в iOS.Мое тестовое приложение испытывает ту же проблему.

Я не знаю, было ли это исправлено в iOS 6, ответ для iOS 5.

0 голосов
/ 18 августа 2012

Я только что нашел ответ на эту проблему. Мой код в Monotouch, но это должно быть легко сделать то же самое в ObjC. чтобы показать настроенное изображение по умолчанию MKUserLocation, нам нужно добавить подпредставление поверх исходного. для этого переопределите DidAddAnnotationViews в MKMapView делегат

void DidAddAnnotationViews (object sender, MKMapViewAnnotationEventArgs e)
{
            MKAnnotationView v = mapView.ViewForAnnotation(mapView.UserLocation);
            if(v != null)
            {
                if(v.Subviews.Count() == 0)
                {
                    UIImageView iv = new UIImageView(new RectangleF(0,0, 22, 22));
                    iv.Image = UIImage.FromFile("res/pins/Yhere.png");
                    v.AddSubview(iv);
                    v.BringSubviewToFront(iv);
                }
            }
}

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

Получайте удовольствие от настройки MKUserLocation!

0 голосов
/ 28 апреля 2011

Bill

Вам нужен CLLocationManager, который был инициализирован с применимым требуемым значением Accuracy и distanceFilter, а затем реализовал применимые методы делегата и установил свой собственный код в качестве делегата в экземпляре locationManager.

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

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation ;

Ура, Mack

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