Подтвердить что ты не робот

Автомобиль (аннотация) анимация (например, uber app) не работает

Я сделал один демо-проект (из демонстрации Moving-MKAnnotationView на github) для перемещения автомобиля на карту, следующим за его ссылкой

https://github.com/pratikbhiyani/Moving-MKAnnotationView

Я редактирую свой код на основе заданного ответа vinaut, но проблема заключается в том, что когда мы масштабируем или прокручиваем анимацию карты, отвлекайтесь на ios 7 и ios 6, когда мы увеличиваем или прокручиваем аннотацию карты, установленную на его первоначальный угол на некоторое время.

Ниже приведен снимок экрана моего демонстрационного проекта

enter image description here

Вот код, который я изменяю

- (void) setPosition : (id) posValue;
{
    NSLog(@"set position");

    //extract the mapPoint from this dummy (wrapper) CGPoint struct
    MKMapPoint mapPoint = *(MKMapPoint*)[(NSValue*)posValue pointerValue];

    CLLocationCoordinate2D coord = MKCoordinateForMapPoint(mapPoint);
    CGPoint toPos;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

        toPos = [self.mapView convertCoordinate:coord toPointToView:self.mapView];
    }
    else
    {
        CGFloat zoomFactor =  self.mapView.visibleMapRect.size.width / self.mapView.bounds.size.width;
        toPos.x = mapPoint.x/zoomFactor;
        toPos.y = mapPoint.y/zoomFactor;
    }



    [self setTransform:CGAffineTransformMakeRotation([self getHeadingForDirectionFromCoordinate:MKCoordinateForMapPoint(previousPoint) toCoordinate: MKCoordinateForMapPoint(mapPoint)])];

    if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {

        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];

        animation.fromValue = [NSValue valueWithCGPoint:self.center];
        animation.toValue = [NSValue valueWithCGPoint:toPos];
        animation.duration = 1.0;
        animation.delegate = self;
        animation.fillMode = kCAFillModeForwards;
        //[self.layer removeAllAnimations];
        [self.layer addAnimation:animation forKey:POSITIONKEY];

        //NSLog(@"setPosition ANIMATED %x from (%f, %f) to (%f, %f)", self, self.center.x, self.center.y, toPos.x, toPos.y);
    }

    self.center = toPos;

    previousPoint = mapPoint;
}

Моя цель - перемещать автомобиль так же, как в приложении uber.

4b9b3361

Ответ 1

Кажется, что что-то изменилось с помощью функций преобразования для CLCoordinate2D/MKMapPoint/CGPoint...

Обнаружение точки в MKPolygon сломалось с iOS7 (CGPathContainsPoint)

Аннотация исчезает, потому что преобразование между MkMapPoints и CGIPoints больше не работает, если вы зарегистрируете "позицию" CALayer, вы получите точки за пределами представления. Не знаю, почему это срабатывает при выполнении сенсорных событий.

Если вы измените функцию на:

    - (void) setPosition : (id) posValue; 
{
    //extract the mapPoint from this dummy (wrapper) CGPoint struct
    MKMapPoint mapPoint = *(MKMapPoint*)[(NSValue*)posValue pointerValue];  
    CLLocationCoordinate2D coord = MKCoordinateForMapPoint(mapPoint);

    CGPoint toPos = [self.mapView convertCoordinate:coord toPointToView:self.mapView];


    if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {

        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];

        animation.fromValue = [NSValue valueWithCGPoint:self.center];
        animation.toValue = [NSValue valueWithCGPoint:toPos];   
        animation.duration = 0.8;
        animation.delegate = self;
        animation.fillMode = kCAFillModeForwards;
        //[self.layer removeAllAnimations];
        [self.layer addAnimation:animation forKey:POSITIONKEY];

        //NSLog(@"setPosition ANIMATED %x from (%f, %f) to (%f, %f)", self, self.center.x, self.center.y, toPos.x, toPos.y);
    }   

    self.center = toPos;


}

Он должен работать снова.

Ответ 2

Я являюсь оригинальным автором Moving-MKAnnotationView (https://github.com/100grams/Moving-MKAnnotationView.git). Этот компонент был первоначально написан с использованием iOS4.3, и с тех пор многое изменилось.:-)

Основной причиной здесь было преобразование из MKMapPoint в CGPoint (координаты экрана). Хотя код работал до этого, он ломается на iOS7, и я исправил его, используя это, чтобы преобразовать координату lat/lon в координаты экрана:

convertCoordinate:toPointToView:

Я исправил это исправление с несколькими другими обновлениями https://github.com/100grams/Moving-MKAnnotationView.git, поэтому теперь он работает на iOS7/Xcode5.

Ответ 3

Проблема отвлечения автомобиля во время масштабирования/прокрутки карты. На самом деле это невозможно, добавив анимацию в аннотацию. Я обнаружил функцию Interpolate, через которую я могу получить места между координатами "От" и "Кому" и установить ее в аннотацию (установка координата аннотации в миллисекундах) будет выглядеть как анимация.

Это не проблема iOS или Map, если вы добавляете анимацию в аннотацию, она добавит к слою аннотации, не относящемуся к точке карты.