2011-10-27 47 views
1

我正在製作一個簡單的指南針,它工作得很好,但動畫可以更平滑。有時它可能會有點跳躍,類似於具有低於標準幀速率的遊戲。有沒有辦法讓它動畫更流暢?CLLocationManager標題更新的平滑顯示

這裏是我的代碼:

- (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; 
} 

回答

3

你的問題是令人困惑,因爲你提到較差的幀速率的遊戲,這使我想知道這三個問題,你遇到:

  • 你得到了如此多的didUpdateHeading:你實際上遇到性能問題的消息(在這種情況下,最後一個值的緩存和計算以確定是否確實需要更新視圖)

  • CoreLocation實際發送你的數據 「跳躍」 周圍,讓您的顯示器看起來神經兮兮

  • 你沒有正確設置你想對變換隱動畫隱含的動畫參數屬性

我猜你的問題實際上是第二一個我上市,並且您將從核心位置獲取標題更新,從位置跳轉到位置。

有兩種方法可以解決這個問題 - 一個在另一個之前(因爲一個更容易,另一個更困難)。

首先,我會嘗試稍微增加過渡時間,或者至少將其手動設置,以便您知道它是什麼......也許是2秒?

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

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

[CATransaction commit]; 

如果做不到這一點,你就會有一些了,並應用某種平滑算法的...但是,我相信,我聽到一個蘋果開發者提到,他們在自己的核心定位的影片之一這樣做了。

+0

夢幻般的答案!正是我在找什麼。謝謝。 –

+0

啊,太好了!很高興我可以幫忙:) – Steve

+0

@Steve請你指出你在答案中提到的視頻是否可能,或者提供更多關於它的信息,以便我們找到它。 – Scar