【发布时间】:2010-10-05 10:21:33
【问题描述】:
我已经成功地将地图视图与代表用户当前位置的图钉注释放在一起,该位置以设定的时间间隔更新。当位置管理器更新用户的位置时,大头针注释会消失并重新出现在新位置。有没有人玩过通过使用动画来更新当前用户的 GPS 位置,就像 Apple 的官方地图应用程序中所做的那样?如果是这样,我很想得到一些指导来让它发挥作用。谢谢!
【问题讨论】:
标签: objective-c ios4
我已经成功地将地图视图与代表用户当前位置的图钉注释放在一起,该位置以设定的时间间隔更新。当位置管理器更新用户的位置时,大头针注释会消失并重新出现在新位置。有没有人玩过通过使用动画来更新当前用户的 GPS 位置,就像 Apple 的官方地图应用程序中所做的那样?如果是这样,我很想得到一些指导来让它发挥作用。谢谢!
【问题讨论】:
标签: objective-c ios4
解决方案 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
【讨论】: