使用动画更改 GMSCircle 半径

Posted

技术标签:

【中文标题】使用动画更改 GMSCircle 半径【英文标题】:Change GMSCircle radius with Animation 【发布时间】:2014-05-25 20:51:07 【问题描述】:

我正在为我的应用程序使用 Google Maps ios sdk。在我的应用程序中,用户可以画一个栅栏(一个圆圈),然后可以编辑以更改和调整圆的半径。 它的大小调整正确但是当半径值改变它的瞬间时,不是像地图放大/缩小这样的平滑动画。最新的 GMaps sdk for ios 可以实现吗?

显然,这是不可能的,因为我看到的是 GMSCircle 是从 GMSOverlay 继承的,GMSOverlay 是 NSObject 的子级,所以它绝对不是一个视图,而是用某个图层或类似的东西绘制叠加层。

任何帮助表示赞赏..!!

谢谢..!!

【问题讨论】:

你试过改变动画块的半径吗?也许二传手改变了实际层的一些属性,这可以是动画 是的,我尝试在动画块中更改它,它仍然没有动画.. 您可以尝试使用计时器重复将半径从起始值更新到结束值... 【参考方案1】:

我发现你可以改变半径,圆就会改变。 所以我写了一个帮助类来做到这一点:

@interface TAMapCircle : GMSCircle

    CLLocationDistance _from;
    CLLocationDistance _to;
    NSTimeInterval _duration;

@property (nonatomic, copy) void(^handler)();
@property (nonatomic, strong) NSDate * begin;
@end

@implementation TAMapCircle
// just call this
-(void)beginRadiusAnimationFrom:(CLLocationDistance)from
                             to:(CLLocationDistance)to
                       duration:(NSTimeInterval)duration
                completeHandler:(void(^)())completeHandler 

    self.handler = completeHandler;
    self.begin = [NSDate date];
    _from = from;
    _to = to;
    _duration = duration;

    [self performSelectorOnMainThread:@selector(updateSelf) withObject:nil waitUntilDone:NO];


// internal update
-(void)updateSelf 

    NSTimeInterval i = [[NSDate date] timeIntervalSinceDate:_begin];
    if (i >= _duration) 
        self.radius = _to;
        self.handler();
        return;
     else 
        CLLocationDistance d = (_to - _from) * i / _duration + _from;
        self.radius = d;
        // do it again at next run loop
        [self performSelectorOnMainThread:@selector(updateSelf) withObject:nil waitUntilDone:NO];
    

@end

希望我的回答能有所帮助。

【讨论】:

你有这个样品吗?【参考方案2】:

我使用 CADisplayLink 做了类似的事情。它使得在 GMSMapView 中制作简单的动画变得非常容易。

https://developer.apple.com/library/prerelease/ios/documentation/QuartzCore/Reference/CADisplayLink_ClassRef/index.html

【讨论】:

【参考方案3】:

您需要将尝试进行的动画更改包装在UIView 动画块中。这在最新版本的 iOS SDK 中已更改,因此方法签名为 [UIView beginAnimation:]。包装您在此块中所做的任何更改,它们将由UIKit 进行动画处理。如果这不起作用,您可以使用 CoreAnimation 事务转到较低级别。

【讨论】:

尝试了所有这些,但问题是这些都适用于 UIVIew ,并且这个覆盖层是 NSObject 子类..

以上是关于使用动画更改 GMSCircle 半径的主要内容,如果未能解决你的问题,请参考以下文章

html 使用CSS更改图像的大小,为其添加边框并更改其样式和边框半径

无法更改 Bootstrap 5 轮播指示器边框半径

如何使用创建的自定义 IBDesignable 类从情节提要中更改按钮的角半径

更改热图上单个点的半径?

iOS 13 - UISegmentedControl - 如何更改 selectedSegment 的圆角半径?

如何更改 d3 中圆的半径和不透明度?