GMSGroundOverlay-Animation - sollte ich einen CATiledLayer verwenden?

99

Ich experimentiere mit der neuesten Version 1.2.1.2944 von Google Maps für iOS SDK, um a zu animieren GMSGroundOverlay. Der Benutzer hat die Kontrolle über die Bildsequenz, daher ist die Verwendung einer Animation UIImageleider nicht möglich, daher lade ich sie im laufenden Betrieb UIImage. Das GMSGroundOverlay.iconist auf das eingestellt UIImage, was aktualisiert wird.

Abgesehen von der hohen Speichernutzung habe ich anscheinend eine Einschränkung dahingehend festgestellt, dass jedes Mal, wenn ich versuche, eine UIImageVerwendung GMSGroundOverlay.iconmit mehr als 1000 x 1000 Pixel zu überlagern, ein Absturz auftritt. UIImageWenn Sie auf eine Größe von 1000 x 1000 Pixel verweisen, wird der Absturz umgangen.

Es fällt mir jedoch auf, dass ich CATiledLayerdas Bild möglicherweise verwenden sollte, um es nur in den Speicher und anschließend in die Icon-Eigenschaft von zu laden. Hat GMSGroundOverlayjemand Erfahrung mit der Verwendung CATiledLayervon Google Maps für iOS SDK und der Sequenzierung von Bildern als Animation GMSGroundOverlay?

RobWhistler
quelle
Ich habe genau das gleiche Problem, obwohl die Schwelle, die ich für Abstürze sehe, noch niedriger ist. Ich würde gerne eine Lösung dafür sehen.
Eric.mitchell
Ich möchte eine Lösung für alle Arten von GMSOverlays
Daij-Djan
Ich sehe nicht, wie Sie TiledLayer verwenden möchten. Das Overlay verwendet ein UIImage.
Daij-Djan

Antworten:

1

Ich habe diese Antwort von pressanswer.com erhalten. Ich denke, sie kann Ihnen helfen.

Da ich den Schlüsselpfad "Position" derzeit nicht zum Animieren verwenden kann, habe ich ihn letztendlich mit den Schlüsselpfaden "Breite" und "Länge" getrennt animiert.

Berechnen Sie zuerst die Punkte und fügen Sie sie zu zwei separaten Arrays hinzu, eines für den Breitengrad (y) und eines für den Längengrad (x). Verwenden Sie dann die Eigenschaft values ​​in CAKeyFrameAnimation zum Animieren. Erstellen Sie 2 CAKeyFrameAnimation-Objekte (1 für jede Achse), gruppieren Sie sie mit CAAnimationGroup und animieren Sie sie zu einem Kreis.

In meiner Gleichung verändere ich die Länge des Radius auf jeder Achse, damit ich auch einen ovalen Pfad erzeugen kann.

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
quelle
Dies ist nicht das GMSGroundOverlay. Sie zeigen einen GMSMarker. Die Überlagerung bietet nicht den gleichen Zugriff auf die "Ebene"
Erik Gross