【问题标题】:iphone sdk MapView update users locationiphone sdk MapView 更新用户位置
【发布时间】:2010-10-05 10:21:33
【问题描述】:

我已经成功地将地图视图与代表用户当前位置的图钉注释放在一起,该位置以设定的时间间隔更新。当位置管理器更新用户的位置时,大头针注释会消失并重新出现在新位置。有没有人玩过通过使用动画来更新当前用户的 GPS 位置,就像 Apple 的官方地图应用程序中所做的那样?如果是这样,我很想得到一些指导来让它发挥作用。谢谢!

【问题讨论】:

    标签: objective-c ios4


    【解决方案1】:

    解决方案 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      相关资源
      最近更新 更多