Сглаживание отображения обновлений заголовка CLLocationManager - PullRequest
1 голос
/ 27 октября 2011

Я делаю простой компас, и он прекрасно работает, но анимация может быть более плавной.Время от времени это может быть немного нервным, подобно игре с частотой смены кадров.Есть ли способ сделать анимацию более плавной?

Вот мой код:

- (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 Ответ

3 голосов
/ 27 октября 2011

Ваш вопрос сбивает с толку, потому что вы упоминаете игры с низкой частотой кадров, что заставляет меня задуматься о том, какая из трех проблем у вас возникает:

  • Вы получаете так много didUpdateHeading:сообщения о том, что у вас действительно есть проблема с производительностью (в этом случае некоторое кэширование последнего значения и вычисление, чтобы определить, действительно ли вам нужно обновить представление, может быть в порядке)

или

  • CoreLocation фактически отправляет вам данные, которые «перепрыгивают» и заставляют ваш дисплей выглядеть нервным

или

  • Вы неправильно настроили параметры неявной анимации для неявной анимации, которую вы хотите иметь в свойстве transform

Я предполагаю, что ваша проблема на самом деле секунда , которую я перечислил, и что вы получаете обновления заголовков из основного местоположения, которые "прыгают" из местоположения вместо нахождения.

Есть два подхода к этой проблеме - один перед другим (потому что один легче, а другой сложнее).

Сначала я бы попытался увеличить переходнемного, или, по крайней мере, установите его вручную, чтобы вы знали, что это ... может быть, 2 секунды?

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

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

[CATransaction commit];

Если это не удастся, вам придется кое-что придумать и применить какой-то алгоритм сглаживания ... однако, я думаю, я слышал, как разработчик Apple упомянул, что они уже сделали это в одном из своих основных местоположений.видео.

...