【问题标题】:Animate viewForOverlay MKCircleView动画 viewForOverlay MKCircleView
【发布时间】:2012-08-23 20:13:33
【问题描述】:

我想为要添加为 MKOverLay 的圆圈设置动画。我希望它从屏幕顶部掉下来。如何通过委托方法制作动画?还是在叠加层的添加中?谁能指出我正确的方向?谢谢!

我在 mapView 委托方法中有这个

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{

    if([overlay isKindOfClass:[MKCircle class]]) {
        // Create the view for the radius overlay.
        MKCircleView *circleView = [[MKCircleView alloc] initWithOverlay:overlay];
        circleView.strokeColor = [UIColor whiteColor];
        circleView.fillColor = [[UIColor blueColor] colorWithAlphaComponent:0.2];

        return circleView;
    }

    return nil;
}

然后我像这样添加叠加层:

        MKCircle *circle = [MKCircle circleWithCenterCoordinate:userCoord radius:200];
        [mainMapView addOverlay:circle];

【问题讨论】:

    标签: iphone delegates mkmapview mkoverlay


    【解决方案1】:

    假设您想要放大 + 淡入动画,您可以这样做:

    @interface MyMapOverlayView : UIView<CAAction>
    @end
    
    @implementation MyMapOverlayView
    
    - (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
    {
        if ( [ event isEqualToString:@"onOrderIn" ] )
        {
            return self ;
        }
    
        return [ super actionForLayer:layer forKey:event ] ;
    }
    
    - (void)runActionForKey:(NSString *)event object:(id)anObject arguments:(NSDictionary *)dict
    {
        if ( [ event isEqualToString:@"onOrderIn" ] )
        {
            {
                CABasicAnimation * anim = [ CABasicAnimation animationWithKeyPath:@"transform" ] ;
                anim.fromValue = [ NSValue valueWithCATransform3D:CATransform3DMakeScale( 0.1f, 0.1f, 1.0f ) ] ;
                [ self.layer addAnimation:anim forKey:nil ] ;
            }
    
            {
                CABasicAnimation * anim = [ CABasicAnimation animationWithKeyPath:@"opacity" ] ;
                anim.fromValue = @0.0f ;
                [ self.layer addAnimation:anim forKey:nil ] ;
            }
        }
    }
    
    @end
    

    n.b.:我猜测了在将叠加层添加到地图视图时如何添加这些动画,但我还没有测试过。您将需要进行实验。您也许可以在创建视图时设置它们。

    更新:我测试过了,好像可以了。

    【讨论】:

    • 我实际上想在这个方法上添加我绘制圆形覆盖的地方。我应该将上面的代码添加到我的 MyCustomCircle 类中吗? MKCircle *circle2 = [MKCircle circleWithCenterCoordinate:userCoord radius:[self convertToMetersFromDegrees:radius]]; MyCustomCircle *myCircleView = [[MyCustomCircle alloc] initWithCircle:circle2]; [mainMapView addOverlay:myCircleView.circle];
    • 我会说,如果您要为 myCircleView 设置动画,请将此代码添加到 MyCustomCircle ——它会在添加到父视图时生成动画
    【解决方案2】:

    这是一些未经测试的代码。如果它确实有效,您可能需要更改动画。

    - (void)mapView:(MKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews
    {
        for (MKOverlayView *view in overlayViews) {
    
            CGRect endFrame = view.frame;
            view.frame = CGRectMake(endFrame.origin.x, endFrame.origin.y-500, 0, 0);
    
            [UIView animateWithDuration:1.0 animations:^{
                view.frame = endFrame;
            }];
        }
    }
    

    【讨论】:

    • 代码正在触发,并且断点在 for 循环内的 for 和语句中命中,但没有动画。如果我将 -500 更改为 -50000 并移除动画块,则会在地图上绘制圆圈,并且在它应该在的地方以北。当我重新添加动画时,圆圈只会出现在它应该出现的位置(view.frame)。为什么即使我知道代码被调用,动画实际上也不起作用?
    • 我不确定。这段代码取自我用来为注释视图设置动画的东西,我从未尝试过使用叠加层。动画块是 iOS 4+,但我假设您正在使用它,因为它没有崩溃。检查之前和之后的框架,看看那里发生了什么。
    • 不要使用frame 制作动画。更好的选择是通过transform 制作动画。例如从某个偏移 +100x、+100y 到恒等变换。
    • 我不在电脑前,我稍后再试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多