Анимация GMSGroundOverlay - следует ли использовать CATiledLayer?

99

Я экспериментирую с Google Maps for iOS SDK последней версии 1.2.1.2944, чтобы анимировать файл GMSGroundOverlay. Пользователь имеет контроль над последовательностью изображений, поэтому использование анимации, UIImageк сожалению, невозможно, поэтому я загружаюсь UIImageна лету. Установлен GMSGroundOverlay.iconна UIImageобновляемый.

Помимо большого использования памяти, я, кажется, столкнулся с ограничением в том, что всякий раз, когда я пытаюсь наложить UIImageиспользование GMSGroundOverlay.iconразмером более 1000 x 1000 пикселей, происходит сбой. Ссылка на UIImage1000px x 1000px позволяет избежать сбоя.

Мне кажется, что, возможно, мне следует использовать CATiledLayerдля обработки изображения только загрузку в память и впоследствии в свойство значка GMSGroundOverlay, но есть ли у кого-нибудь опыт использования CATiledLayerс Google Maps для iOS SDK и упорядочивания изображений как анимированных GMSGroundOverlay?

Роб Уистлер
источник
У меня такая же проблема, хотя порог сбоев, который я вижу, еще ниже. Я хотел бы увидеть решение для этого.
eric.mitchell 05
Я хотел бы решение для всех видов GMSOverlays
Daij-Djan
Я не понимаю, как вы хотите использовать TiledLayer .. в оверлее используется UIImage ...
Дайдж-Джан

Ответы:

1

Я получил этот ответ от pressanswer.com, думаю, это может вам помочь.

Поскольку в настоящее время я не могу использовать ключевой путь «позиция» для анимации, я закончил тем, что анимировал его, используя пути клавиш «широта» и «долгота» отдельно.

Сначала вычислите точки и добавьте их в 2 отдельных массива, один для значения широты (y) и один для долготы (x), а затем используйте свойство values ​​в CAKeyFrameAnimation для анимации. Создайте 2 объекта CAKeyFrameAnimation (по 1 для каждой оси), сгруппируйте их вместе с помощью CAAnimationGroup и анимируйте их вместе, чтобы сформировать круг.

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

NSMutableArray *latitudes = [NSMutableArray arrayWithCapacity:21];
    NSMutableArray *longitudes = [NSMutableArray arrayWithCapacity:21];
    for (int i = 0; i <= 20; i++) {
        CGFloat radians = (float)i * ((2.0f * M_PI) / 20.0f);

        // Calculate the x,y coordinate using the angle
        CGFloat x = hDist * cosf(radians);
        CGFloat y = vDist * sinf(radians);

        // Calculate the real lat and lon using the
        // current lat and lon as center points.
        y = marker.position.latitude + y;
        x = marker.position.longitude + x;


        [longitudes addObject:[NSNumber numberWithFloat:x]];
        [latitudes addObject:[NSNumber numberWithFloat:y]];
    }

    CAKeyframeAnimation *horizontalAnimation = [CAKeyframeAnimation animationWithKeyPath:@"longitude"];
    horizontalAnimation.values = longitudes;
    horizontalAnimation.duration = duration;

    CAKeyframeAnimation *verticleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"latitude"];
    verticleAnimation.values = latitudes;
    verticleAnimation.duration = duration;

    CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
    group.animations = @[horizontalAnimation, verticleAnimation];
    group.duration = duration;
    group.repeatCount = HUGE_VALF;
    [marker.layer addAnimation:group forKey:[NSString stringWithFormat:@"circular-%@",marker.description]];
Рашад Валлиенгал
источник
Это не GMSGroundOverlay. Вы показываете GMSMarker. Оверлей не обеспечивает такой же доступ к «слою»
Эрик Гросс