99 votes

GMSGroundOverlay animation - dois-je utiliser un CATiledLayer ?

Je suis à expérimenter avec les Cartes Google maps pour iOS SDK version la plus récente 1.2.1.2944 pour animer un GMSGroundOverlay. L'utilisateur a le contrôle de la séquence d'image, donc, à l'aide d'une animation en UIImage n'est pas une possibilité, malheureusement, je suis donc en cours de chargement dans l' UIImage à la volée. L' GMSGroundOverlay.icon est définie à l' UIImage qui est en train d'être mis à jour.

Outre l'utilisation de mémoire, il me semble avoir frappé une limitation de que chaque fois que j'essaie de superposer UIImage l'aide GMSGroundOverlay.icon c'est plus de 1000px x 1000px, il se bloque. Le référencement d'un UIImage de 1000px x 1000px permet de contourner le blocage.

Il me semble cependant que je devrais peut-être utiliser CATiledLayer pour la manipulation de l'image, de ne charger en mémoire et ensuite dans l'icône de la propriété de l' GMSGroundOverlay, mais quelqu'un avait une expérience de l'utilisation de CATiledLayer avec Google Maps pour iOS SDK et le séquençage images animées GMSGroundOverlay?

Merci à l'avance!

1voto

Rashad Annara Points 572

J'ai reçu cette réponse de pressinganswer.com je pense qu'il peut vous aide.

Comme actuellement je ne peux pas utiliser la "position" chemin d'accès clé pour l'animation, j'ai fini par l'animer à l'aide de la "latitude" et "longitude" keypaths séparément.

Tout d'abord calculer les points et les ajouter à 2 tableaux distincts, l'un pour la latitude de valeur (y) et la longitude (x), puis utiliser les valeurs de propriété dans CAKeyFrameAnimation pour animer. Créer 2 CAKeyFrameAnimation objets (1 pour chacun des axes) et de groupe à l'aide d'CAAnimationGroup et animez-les ensemble pour former un cercle.

Dans mon équation, j'varier la longueur du rayon sur chaque axe, de sorte que je peux aussi générer un ovale de voie.

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]];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X