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

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

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

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

谢谢..!!

【问题讨论】:

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

标签: ios google-maps-sdk-ios


【解决方案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 子类..
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多