iphone SDK MapView обновить местоположение пользователей - PullRequest
0 голосов
/ 05 октября 2010

Я успешно соединил вид карты с аннотацией булавки, представляющей текущую позицию пользователя, которая обновляется с установленным интервалом. Когда менеджер местоположений обновляет положение пользователя, аннотация булавки исчезает и вновь появляется в новом местоположении. Кто-нибудь играл с обновлением местоположения GPS текущего пользователя с помощью анимации, как это делается в официальном картографическом приложении Apple? Если так, я хотел бы, чтобы некоторые указатели заставили это работать. Спасибо!

1 Ответ

0 голосов
/ 05 октября 2010

Решение 1:

Во-первых, вам нужно заставить свой контроллер представления реализовать MKMapViewDelegate, если это еще не сделано.

Затем реализуйте этот метод:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
   MKAnnotationView *aV; 
   for (aV in views) {
     CGRect endFrame = aV.frame;

     aV.frame = CGRectMake(aV.frame.origin.x, aV.frame.origin.y - 230.0, aV.frame.size.width, aV.frame.size.height);

     [UIView beginAnimations:nil context:NULL];
     [UIView setAnimationDuration:0.45];
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
         [aV setFrame:endFrame];
     [UIView commitAnimations];

   }
}

Добавьте свои аннотации в MapView, и когда они будут добавлены, будет вызван этот метод делегата, который будет анимировать контакты сверху вниз по мере их добавления.

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

Решение 2:

В качестве альтернативы, если вы создаете подкласс MKAnnotationView, вы можете использовать didMoveToSuperview для запуска анимации. Следующее делает падение, которое заканчивается легким эффектом «хлюпания»

#define kDropCompressAmount 0.1

  @implementation MyAnnotationViewSubclass

  ...

  - (void)didMoveToSuperview {
      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];
      animation.duration = 0.4;
      animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
      animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(0, -400, 0)];
      animation.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];

      CABasicAnimation *animation2 = [CABasicAnimation animationWithKeyPath:@"transform"];
      animation2.duration = 0.10;
      animation2.beginTime = animation.duration;
      animation2.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
      animation2.toValue = [NSValue valueWithCATransform3D:CATransform3DScale(CATransform3DMakeTranslation(0, self.layer.frame.size.height*kDropCompressAmount, 0), 1.0, 1.0-kDropCompressAmount, 1.0)];
      animation2.fillMode = kCAFillModeForwards;

      CABasicAnimation *animation3 = [CABasicAnimation animationWithKeyPath:@"transform"];
      animation3.duration = 0.15;
      animation3.beginTime = animation.duration+animation2.duration;
      animation3.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
      animation3.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
      animation3.fillMode = kCAFillModeForwards;

      CAAnimationGroup *group = [CAAnimationGroup animation];
      group.animations = [NSArray arrayWithObjects:animation, animation2, animation3, nil];
      group.duration = animation.duration+animation2.duration+animation3.duration;
      group.fillMode = kCAFillModeForwards;

      [self.layer addAnimation:group forKey:nil];
  }

Надеюсь, это поможет!

PK

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