بعد تدوير Calayer باستخدام cabasicanimation ، تقفز الطبقة إلى وضعها غير المعتدل
-
21-09-2019 - |
سؤال
أحاول إنشاء عملة معدنية. صورة العملة هي Calayer مع 2 cabasicanimations عليها - تسقط وتناوب. عندما تصل الرسوم المتحركة المتساقطة إلى نهايتها ، يبقى هناك. على الرغم من ذلك ، فإن الرسوم المتحركة الدورانية ، والتي من المفترض أن تكون عشوائية وينتهي في زاوية مختلفة في كل مرة ، فقط تعود إلى صورة Calayer الأصلية.
أريدها أن تبقى في الزاوية أنهى الرسوم المتحركة. هل هو ممكن؟ كيف فعلتها؟
شفرة:
//Moving down animation:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
anim.duration = 1;
anim.autoreverses = NO;
anim.removedOnCompletion = YES;
anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)];
anim.toValue = [NSNumber numberWithInt: 0];
//Rotation Animation:
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rota.duration = 4;
rota.autoreverses = NO;
rota.removedOnCompletion = NO;
rota.fromValue = [NSNumber numberWithFloat: 0];
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ];
[cl addAnimation: rota forKey: @"rotation"];
[cl addAnimation: anim forKey: @"animateFalling"];
المحلول
هل قمت بتعيين خاصية rediveDoncompletion للرسوم المتحركة الدورانية إلى لا ، على سبيل المثال ،
rota.removedOnCompletion = NO;
يجب أن يترك ذلك طبقة العرض التقديمي حيث كانت عندما انتهت الرسوم المتحركة. الافتراضي هو نعم ، والذي سيعود إلى قيمة النموذج ، أي السلوك الذي تصفه.
يجب أيضًا تعيين FillMode ، أي ،
rota.fillMode = kCAFillModeForwards;
نصائح أخرى
كنت أحاول تدوير سهم ذهابًا وإيابًا ، مثل تأثير Twitter/Facebook "سحب إلى تحديث".
المشكلة هي أنني كنت أقوم بالتناوب ذهابًا وإيابًا على نفس Uiview ، لذلك بعد الإضافة
rotation.removedOnCompletion = NO;
rotation.fillMode = kCAFillModeForwards;
حرب الرسوم المتحركة الأمامية تعمل بشكل جيد ولكن الرسوم المتحركة للخلف لم تكن تعمل على الإطلاق.
لذلك أضفت السطر الأخير الذي اقترحه YeahDixon ، بالإضافة إلى تعيين تحويل العرض إلى حالة الرسوم المتحركة المكتملة: (التناوب بمقدار 180 درجة)
[myview.layer removeAllAnimations];
myView.transform = CGAffineTransformMakeRotation(M_PI);
للرسوم المتحركة "استعادة" (للخلف) أفعل ذلك عند الانتهاء:
myView.transform = CGAffineTransformMakeRotation(0);
... وهو يعمل بشكل جيد. بطريقة ما لا تحتاج إلى استدعاء الإزالة.
لقد وجدت ذلك عن طريق الإعداد: removedOnCompletion = NO;
لم ينتج تسربًا مرئيًا في الأدوات ، لكنه لم يتم توصيله وكان يتراكم كمية صغيرة من الذاكرة. IDK إذا كان تنفيذي أو ماذا ، ولكن عن طريق إضافة عمليات الإزالة في نهاية الرسوم المتحركة يبدو أنها توضح هذا القدر الصغير من الذاكرة المتبقية.
[myview.layer removeAllAnimations];