بعد تدوير Calayer باستخدام cabasicanimation ، تقفز الطبقة إلى وضعها غير المعتدل

StackOverflow https://stackoverflow.com/questions/1376753

سؤال

أحاول إنشاء عملة معدنية. صورة العملة هي 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];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top