Animowanie GMSGroundOverlay - czy powinienem używać CATiledLayer?

99

Eksperymentuję z pakietem SDK Map Google na iOS w najnowszej wersji 1.2.1.2944, aby animować plik GMSGroundOverlay. Użytkownik ma kontrolę nad sekwencją obrazów, więc używanie animacji UIImagenie jest niestety możliwe, więc ładuję w UIImagelocie. GMSGroundOverlay.iconJest ustawiony na UIImagektóry jest aktualizowany.

Oprócz dużego zużycia pamięci, wydaje mi się, że napotkałem ograniczenie polegające na tym, że za każdym razem, gdy próbuję nałożyć na siebie UIImageużycie GMSGroundOverlay.icono rozmiarze większym niż 1000 pikseli x 1000 pikseli, ulega awarii. Odniesienie do pliku UIImageo wymiarach 1000 x 1000 pikseli pozwala obejść awarię.

Wydaje mi się jednak, że może powinienem wykorzystać CATiledLayerdo obsługi obrazu tylko ładowanie do pamięci, a następnie do właściwości ikony GMSGroundOverlay, ale czy ktoś miał jakieś doświadczenie w korzystaniu CATiledLayerz Google Maps na iOS SDK i sekwencjonowaniu obrazów jako animowanych GMSGroundOverlay?

RobWhistler
źródło
Mam ten sam problem, chociaż próg awarii jest jeszcze niższy. Bardzo chciałbym zobaczyć rozwiązanie tego problemu.
eric.mitchell
Chciałbym rozwiązanie dla wszystkich rodzajów GMSOverlays
Daij-Djan
Nie rozumiem, jak chcesz używać TiledLayer… nakładka używa UIImage ...
Daij-Djan

Odpowiedzi:

1

Otrzymałem tę odpowiedź z pressanswer.com, myślę, że może ci to pomóc.

Ponieważ obecnie nie mogę użyć keypath „position” do animacji, skończyło się na animowaniu go przy użyciu osobno ścieżek „latitude” i „longitude”.

Najpierw oblicz punkty i dodaj je do 2 oddzielnych tablic, jednej dla wartości szerokości geograficznej (y) i jednej dla długości geograficznej (x), a następnie użyj właściwości values ​​w CAKeyFrameAnimation do animacji. Utwórz 2 obiekty CAKeyFrameAnimation (po jednym na każdą oś) i zgrupuj je razem za pomocą CAAnimationGroup i animuj je razem, aby utworzyły okrąg.

W moim równaniu zmieniam długość promienia na każdej osi, dzięki czemu mogę również wygenerować owalną ścieżkę.

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
źródło
To nie jest GMSGroundOverlay. Pokazujesz GMSMarker. Nakładka nie zapewnia takiego samego dostępu do „warstwy”
Erik Gross