使用 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 设置动画的主要内容,如果未能解决你的问题,请参考以下文章

CAAnimation - 显示/隐藏持续时间为 0

如何在 UIView 中使用 CAAnimation 添加波纹动画 [关闭]

CAAnimation 跟踪进度

CATransaction 和 CAAnimation 有啥区别?

如何在删除之前等待重复的 CAAnimation 完成一个循环

尝试使用 CAAnimation 和 CATextLayer 滑动文本