Animação GMSGroundOverlay - devo usar um CATiledLayer?

99

Estou testando o SDK do Google Maps para iOS versão 1.2.1.2944 mais recente para animar a GMSGroundOverlay. O usuário tem controle sobre a sequência de imagens, então UIImage, infelizmente, usar uma animação não é uma possibilidade, então estou carregando na UIImagehora. O GMSGroundOverlay.iconé definido como o UIImageque está sendo atualizado.

Além do alto uso de memória, parece que encontrei uma limitação: sempre que tento sobrepor um UIImageuso GMSGroundOverlay.iconcom mais de 1000px x 1000px, ele trava. Fazer referência a UIImage1000px x 1000px contorna a falha.

No entanto, me ocorre que talvez eu deva utilizar CATiledLayerpara manipular a imagem para carregar apenas na memória e, posteriormente, na propriedade icon de GMSGroundOverlay, mas alguém já teve alguma experiência de uso CATiledLayercom o Google Maps para iOS SDK e sequenciamento de imagens como uma animação GMSGroundOverlay?

RobWhistler
fonte
Estou tendo o mesmo problema, embora o limite que vejo para travamentos seja ainda menor. Eu adoraria ver uma solução para isso.
eric.mitchell
Eu gostaria de uma solução para todos os tipos de GMSOverlays
Daij-Djan
Não vejo como você deseja usar TiledLayer .. a sobreposição usa um UIImage ...
Daij-Djan

Respostas:

1

Recebi esta resposta em pressanswer.com, acho que pode te ajudar.

Como atualmente não posso usar o caminho-chave "position" para animar, acabei fazendo a animação usando os caminhos-chave "latitude" e "longitude" separadamente.

Primeiro calcule os pontos e adicione-os a 2 matrizes separadas, uma para o valor de latitude (y) e outra para longitude (x) e, em seguida, use a propriedade de valores em CAKeyFrameAnimation para animar. Crie 2 objetos CAKeyFrameAnimation (1 para cada eixo) e agrupe-os usando CAAnimationGroup e anime-os para formar um círculo.

Na minha equação, vario o comprimento do raio em cada eixo para que também possa gerar um caminho oval.

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]];
Rashad Valliyengal
fonte
Este não é o GMSGroundOverlay. Você está mostrando um GMSMarker. A sobreposição não fornece o mesmo acesso à 'camada'
Erik Gross