平滑显示CLLocationManager标题更新

时间:2011-10-27 14:05:08

标签: objective-c ios core-location

我正在制作一个简单的指南针,它工作得很好,但动画可以更顺畅。有时它可能有点跳跃,类似于具有低于帧速率的游戏。有没有办法让它更加流畅?

这是我的代码:

- (void)viewDidLoad
{
[super viewDidLoad];

CLLocationManager* lm = [[CLLocationManager alloc] init];
self.locman = lm;
self.locman.delegate = self;
self.locman.headingFilter = 2;
[self.locman startUpdatingHeading];
}

- (void) locationManager:(CLLocationManager *)manager 
                didUpdateHeading:(CLHeading *)newHeading {
CGFloat h = newHeading.magneticHeading;
NSString* dir = @"N";
NSArray* cards = [NSArray arrayWithObjects: 
@"N", @"NE", @"E", @"SE", @"S", @"SW", @"W", @"NW", nil];
for (int i = 0; i < 8; i++)
    if (h < 45.0/2.0 + 45*i) {
        dir = [cards objectAtIndex: i]; break;
    }
needle.transform = CGAffineTransformMakeRotation(radianConst*-h);
direction = dir;
}

1 个答案:

答案 0 :(得分:3)

你的问题很混乱,因为你提到的帧速率很差的游戏,这让我想知道你遇到的三个问题中的哪一个:

  • 你得到了很多didUpdateHeading:你实际上遇到性能问题的消息(在这种情况下,对最后一个值和计算进行一些缓存以确定你是否确实需要更新视图可能是有序的)

  • CoreLocation实际上是向您发送“跳转”并使您的显示看起来有点突出的数据

  • 您尚未正确设置要在转换属性上隐式动画的隐式动画参数

我猜你的问题实际上是我列出的第二个,并且你正在从核心位置获取标题更新,这些位置从一个位置“跳转”到另一个位置。

我有两种方法可以解决这个问题 - 一个接一个(因为一个更容易,另一个更难)。

首先,我会尝试稍微增加转换持续时间,或者至少手动设置它,以便你知道它是什么......可能是2秒?

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:2.0f]
                 forKey:kCATransactionAnimationDuration];

needle.transform = CGAffineTransformMakeRotation(radianConst*-h);

[CATransaction commit];

如果做不到这一点,你将不得不采用某种平滑算法......但是,我相信我听到苹果开发者提到他们已经在他们的核心位置视频中做过这个。