Автомобиль (аннотация) анимация (например, 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.
Ответы
Ответ 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, если вы добавляете анимацию в аннотацию, она добавит к слою аннотации, не относящемуся к точке карты.