GMSGroundOverlay ภาพเคลื่อนไหว - ฉันควรใช้ CATiledLayer หรือไม่


99

ฉันกำลังทดลองใช้ Google Maps สำหรับ iOS SDK เวอร์ชันล่าสุด 1.2.1.2944 เพื่อทำให้ไฟล์GMSGroundOverlay. ผู้ใช้สามารถควบคุมลำดับภาพได้ดังนั้นการใช้ภาพเคลื่อนไหวUIImageจึงไม่ใช่เรื่องน่าเศร้าดังนั้นฉันจึงโหลดได้UIImageทันที GMSGroundOverlay.iconถูกตั้งค่าUIImageที่กำลังถูกปรับปรุง

นอกเหนือจากการใช้งานหน่วยความจำที่สูงแล้วฉันดูเหมือนจะมีข้อ จำกัด เมื่อใดก็ตามที่ฉันพยายามซ้อนทับUIImageโดยใช้GMSGroundOverlay.iconที่มีขนาดมากกว่า 1,000px x 1,000px มันจะขัดข้อง การอ้างUIImageถึงขนาด 1000px x 1000px จะทำให้เกิดความผิดพลาด

มันทำให้ฉันประหลาดใจว่าบางทีฉันควรใช้CATiledLayerในการจัดการรูปภาพเพื่อโหลดลงในหน่วยความจำเท่านั้นและต่อมาในคุณสมบัติไอคอนของGMSGroundOverlayแต่ใครเคยมีประสบการณ์ในการใช้CATiledLayerGoogle Maps สำหรับ iOS SDK และจัดลำดับภาพเป็นภาพเคลื่อนไหวGMSGroundOverlayบ้างไหม


ฉันมีปัญหาเดียวกันแม้ว่าเกณฑ์ที่ฉันเห็นว่าเกิดข้อขัดข้องจะต่ำกว่าก็ตาม ฉันอยากเห็นวิธีแก้ปัญหานี้
eric.mitchell

ฉันต้องการวิธีแก้ปัญหาสำหรับ GMSOverlays ทุกประเภท
Daij-Djan

ฉันไม่เห็นว่าคุณต้องการใช้ TiledLayer อย่างไร .. การวางซ้อนใช้ UIImage ...
Daij-Djan

คำตอบ:


1

ฉันได้รับคำตอบนี้จาก pressanswer.com ฉันคิดว่ามันอาจช่วยคุณได้

เนื่องจากตอนนี้ฉันไม่สามารถใช้แป้นพิมพ์ "ตำแหน่ง" ในการสร้างภาพเคลื่อนไหวได้ฉันจึงลงเอยด้วยการเคลื่อนไหวโดยใช้แป้นพิมพ์ "ละติจูด" และ "ลองจิจูด" แยกกัน

ขั้นแรกให้คำนวณจุดและเพิ่มลงในอาร์เรย์ 2 อาร์เรย์ที่แยกจากกันหนึ่งอาร์เรย์สำหรับค่าละติจูด (y) และอีกอันสำหรับลองจิจูด (x) จากนั้นใช้คุณสมบัติค่าใน CAKeyFrameAnimation เพื่อทำให้เคลื่อนไหว สร้างวัตถุ CAKeyFrameAnimation 2 ชิ้น (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 ภาพซ้อนทับไม่ได้ให้การเข้าถึง 'เลเยอร์' แบบเดียวกัน
Erik Gross
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.