使用 CAAnimation 在 RMMapView 上为 RMPointAnnotation 设置动画
Posted
技术标签:
【中文标题】使用 CAAnimation 在 RMMapView 上为 RMPointAnnotation 设置动画【英文标题】:Animating RMPointAnnotation in on RMMapView with CAAnimation 【发布时间】:2014-01-28 02:05:29 【问题描述】:所以我使用 MapBox SDK,它是 RouteMe 的 ios 地图 SDK 的一个分支。据我所知,注释的东西可能在这里。
我已经修改了我找到的一些 CAAnimation 代码 here 来尝试实现这一点。我的代码如下。 由于我对 CAAnimation 相当陌生,因此问题可能出在其中,或者与 RouteMe 代码本身有关。它只是为注释包装的图层设置动画。
RMPointAnnotation *point = [[RMPointAnnotation alloc] initWithMapView:self.mapView coordinate:CLLocationCoordinate2DMake([location[@"lat"] floatValue], [location[@"lon"] floatValue]) andTitle:@"App open"];
point.image = [UIImage imageNamed:@"mapPin.png"];
[self.mapView addAnnotation:point];
CGRect endFrame = point.layer.frame;
// Move annotation out of view
point.layer.frame = CGRectMake(point.layer.frame.origin.x, point.layer.frame.origin.y - self.mapView.frame.size.height, point.layer.frame.size.width, point.layer.frame.size.height);
// Animate drop
[UIView animateWithDuration:2.0 delay:0.04 options:UIViewAnimationOptionCurveLinear animations:^
point.layer.frame = endFrame;
// Animate squash
completion:^(BOOL finished)
if (finished)
[UIView animateWithDuration:0.05 animations:^
point.layer.transform = CATransform3DMakeAffineTransform(CGAffineTransformMake(1.0, 0, 0, 0.8, 0, + point.layer.frame.size.height*0.1));
completion:^(BOOL finished)
[UIView animateWithDuration:0.1 animations:^
point.layer.transform = CATransform3DMakeAffineTransform(CGAffineTransformIdentity);
];
];
];
有什么想法吗?
【问题讨论】:
【参考方案1】:以下是开发者对该功能的回复:https://github.com/mapbox/mapbox-ios-sdk/issues/185 该功能不在路线图中。
我想出了一个使用facebook pop library [已更新]的解决方法:
@property (strong, nonatomic) RMAnnotation *annotation;
- (void)viewDidLoad
[super viewDidLoad];
self.annotation = [[RMAnnotation alloc] initWithMapView:self.mapView
coordinate:self.mapView.centerCoordinate
andTitle:@"Drop pin"];
self.annotation.layer.hidden = YES;
[self.mapView addAnnotation:self.annotation];
POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];
anim.fromValue = @(0);
anim.toValue = @(self.view.center.y);
anim.springSpeed = 8;
anim.springBounciness = 4;
anim.delegate = self;
[self.annotation.layer pop_addAnimation:anim forKey:@"positionY"];
-(void)pop_animationDidStart:(POPAnimation *)anim
self.annotation.layer.hidden = NO;
这个想法是在动画开始之前隐藏注释层。
【讨论】:
【参考方案2】:事实证明,这些 Annotation 对象具有一个实际上是 CALayer 的 layer 属性,这意味着您必须在它们上使用 CAAnimations,而不是 UIView 动画。
【讨论】:
能否提供一个 CAAnimations 解决方案的代码示例? 抱歉,我无法再访问代码库,但我知道 Facebook 刚刚为此 code.facebook.com/projects/642915749111632/pop 发布了一个库 感谢您的提示,Sam,图书馆似乎非常有用!我将使用 pop 提交包含我的解决方案的回复 尼古拉看起来很棒! :)以上是关于使用 CAAnimation 在 RMMapView 上为 RMPointAnnotation 设置动画的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UIView 中使用 CAAnimation 添加波纹动画 [关闭]
CATransaction 和 CAAnimation 有啥区别?