কোনও ইউআইভিউ অ্যানিমেশন বাতিল করবেন?


244

কোনও UIViewঅ্যানিমেশন প্রক্রিয়াধীন থাকাকালীন বাতিল করা কি সম্ভব ? নাকি আমাকে সিএ স্তরে নামতে হবে?

উদাহরণস্বরূপ, আমি এই জাতীয় কিছু করেছি (সম্ভবত একটি শেষ অ্যানিমেশন ক্রিয়াও নির্ধারণ করে):

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

তবে অ্যানিমেশনটি শেষ হওয়ার আগে এবং অ্যানিমেশনটি শেষ হওয়ার ইভেন্টটি পাওয়ার আগে, আমি এটি বাতিল করতে চাই (এটি সংক্ষিপ্ত করে কাটা)। এটা কি সম্ভব? চারপাশে গুগলিং কয়েক জনকে একই প্রশ্ন জিজ্ঞাসা করে কোন উত্তর ছাড়াই - এবং এক বা দুজন লোক অনুমান করছেন যে এটি করা সম্ভব নয়।


আপনার মানে কী অ্যানিমেশনটি মাঝখানে থামিয়ে দিয়ে সেখানে রেখে দেওয়া হচ্ছে? বা যেখানে শুরু ছিল সেখানে ফিরে যাওয়া?
ক্রিস লুন্ডি

2
হয় এটিকে একেবারে যেখানেই রেখে দেওয়া হবে, মাঝের অ্যানিমেশন (বাস্তবে আমি যে কোনও উপায়ে সরাসরি অন্য অ্যানিমেশনটি শুরু করব), অথবা শেষ পয়েন্টে সরাসরি লাফিয়ে যাব। আমি ভাবছিলাম প্রথমটি আরও প্রাকৃতিক, তবে হয় তবে এই ক্ষেত্রে আমার পক্ষে কাজ করে।
ফিল্ডসওয়ার্ড

3
@ ক্রিস হ্যানসন: আমি আপনার সম্পাদনার প্রশংসা করি কিন্তু ভাবছি আইফোন ট্যাগটি সরিয়ে দেওয়ার জন্য আপনার যুক্তিটি কী। এটি কোকো-টাচের দ্বারা বোঝানো যেতে পারে তবে আইফোনটিতে আমার জন্য একটি ট্যাগ ফিল্টার রয়েছে এবং সে ক্ষেত্রে এটি মিস করব।
ফিল্ডসওয়ার্ড

@ বুট টু দ্য হেড (আবার): আপনার প্রশ্ন এবং এতে আমার নিজের প্রতিক্রিয়া আমাকে আরও বিচ্ছিন্নতায় পরীক্ষা করতে বলেছে এবং প্রথম আবিষ্কার শেষ হওয়ার আগে আপনি যদি নতুন অ্যানিমেশন শুরু করেন তবে এটি শেষ পয়েন্টে লাফিয়ে উঠবে কিনা তা আমি আবিষ্কার করেছি I নতুনটি শুরু করার আগে
ফিল্ডসওয়ার্ড

- এটি আমার তাত্ক্ষণিক প্রয়োজনগুলি পূরণ করে (এবং আমার আসল কোডটিতে আমার আরও কিছু ত্রুটি রয়েছে বলে পরামর্শ দেয়) তবে আমি জানি যে অন্যরাও তাদের অনুরোধ করছে বলে আমি এই প্রশ্নটি উন্মুক্ত রেখে যাচ্ছি।
ফিল্ডসওয়ার্ড

উত্তর:


114

আমি যেভাবে এটি করি তা হল আপনার শেষ পয়েন্টে একটি নতুন অ্যানিমেশন তৈরি করা। খুব স্বল্প সময়সীমা নির্ধারণ করুন এবং নিশ্চিত করুন যে আপনি +setAnimationBeginsFromCurrentState:বর্তমান অবস্থা থেকে শুরু করতে পদ্ধতিটি ব্যবহার করেছেন । আপনি যখন এটি YES এ সেট করেন, বর্তমান অ্যানিমেশনটি ছোট হয়ে যায়। এরকম কিছু দেখাচ্ছে:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.1];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties

// set view properties

[UIView commitAnimations];

ধন্যবাদ স্টিফেন আসলে আপনি যদি আমার প্রশ্নের নীচে মন্তব্যগুলি পড়ে থাকেন তবে শেষ পর্যন্ত আমি যা করেছি তা হ'ল - তবে আপনি যেহেতু একটি ভাল, স্পষ্টরূপে বিবরণ দিয়েছেন তা এখানে আমি এটি গ্রহণযোগ্য হিসাবে চিহ্নিত করছি
ফিল্সকেয়ারে

1
@ ভজ্টো কীভাবে? দস্তাবেজগুলি বলছে যে setAnimationBeginsFromCurrentState:আইওএস 4 থেকে ব্যবহারটি নিরুৎসাহিত করা হয়েছে তবে এটি এখনও রয়েছে এবং এখনও এটি কাজ করা উচিত।
স্টিফেন ডার্লিংটন

55
আইওএস 4+ এ, অ্যানিমেট-এ ইউআইভিউএনিমেশনঅফশনবাগেনফ্রোম কর্নার স্টেট বিকল্পটি ব্যবহার করুন সময়কাল: বিলম্ব: বিকল্পগুলি: অ্যানিমেশন: সমাপ্তি:
অ্যাডাম

ইউআইভিউএনিমেশনওশনবেগইনফ্রোম কর্নার স্টেট কোনও অগ্রগতিতে থাকা অ্যানিমেশন বা একই সম্পত্তিটিকে লক্ষ্য করে এমন একটি অ্যানিমেশন বাতিল করবে? যদি এটি কোনও অ্যানিমেশন হয় তবে একই অ্যানিমেশনটি অগ্রগতিতে বন্ধ না করে আপনি কীভাবে একই বিন্দুতে একটি নতুন অ্যানিমেশন চালিয়ে যেতে পারেন?
জাকদানস

1
@ আপনার বন্ধুরাজাক, একটি সংক্ষিপ্ত পরীক্ষার উপর ভিত্তি করে দেখে মনে হচ্ছে এটি কেবল একই সম্পত্তিটিকে লক্ষ্য করে একটি অ্যানিমেশন বাতিল করে। আমি এমন একটি স্ক্রোলভিউয়ের আলফা পরিবর্তন করার চেষ্টা করেছি যার বিষয়বস্তু অফসেট অ্যানিমেটেড এবং সামগ্রীআফসেট অ্যানিমেশনটি অবিরত ছিল।
আরলোমেডিয়া

360

ব্যবহার করুন:

#import <QuartzCore/QuartzCore.h>

.......

[myView.layer removeAllAnimations];

22
আমি দেখতে পেলাম যে একটি সংকলক সতর্কতা অপসারণ করতে আমাকে # ইম্পোর্ট <কোয়ার্টজকোর / কোয়ার্টজকোর.এই যোগ করতে হয়েছিল;)
ডিনবম্বার্ন

4
এত সহজ, এবং এটি এখনও খুঁজে পাওয়া শক্ত। এর জন্য আপনাকে ধন্যবাদ, আমি এটি বের করার চেষ্টা করে এক ঘন্টা ব্যয় করেছি।
মিকি ওয়ার্ড

4
এই সমাধানটির সম্ভাব্য সমস্যাটি হ'ল (আইওএস 5 কমপক্ষে) কার্যকর হওয়ার আগে একটি বিলম্ব রয়েছে - এটি শীঘ্রই যথেষ্ট কাজ করে না যদি আপনি যা বলতে চান "এখনই অ্যানিমেশন বন্ধ করুন, আমি এর পরবর্তী লাইনে যাওয়ার আগেই" কোড "।
ম্যাট

14
আমি দেখতে পেলাম যে এটির কলিংয়ের ফলে এটি সম্পূর্ণ হয়: + (বিওএল সমাপ্ত) ব্লক যদি + (শূন্য) অ্যানিমেট ব্যবহার করে তবে ব্লক করুন: (এনএসটিমেইন্টারওয়াল) সময়কাল অ্যানিমেশন: (শূন্য (^) (শূন্য)) অ্যানিমেশন সমাপ্তি: (শূন্য (^) (বিওএল সমাপ্ত) ) সমাপ্তি
JWGS

1
@ ম্যাট আপনি কী এমন কোনও সমাধান জানেন যা অ্যানিমেশন বন্ধ করে দেওয়া বন্ধ করে দেয়? অ্যানিমেশনটি সত্যিই থামার আগে আমি একটি ছোট বিলম্ব পর্যবেক্ষণ করছি।
টিগুয়েরো

62

নির্দিষ্ট ভিউতে সমস্ত অ্যানিমেশনগুলি তাত্ক্ষণিকভাবে বন্ধ করার সহজ উপায় হ'ল:

প্রকল্পটি কোয়ার্টজকোর.ফ্রেমওয়ার্কের সাথে যুক্ত করুন। আপনার কোডের শুরুতে:

#import <QuartzCore/QuartzCore.h>

এখন, যখন আপনি তাদের ট্র্যাকগুলিতে মৃত দৃশ্যে সমস্ত অ্যানিমেশনগুলি বন্ধ করতে চান, এটি বলুন:

[CATransaction begin];
[theView.layer removeAllAnimations];
[CATransaction commit];

মাঝের লাইনটি নিজে থেকেই কাজ করবে, তবে রানলুপ শেষ না হওয়া ("পুনরায় আঁকানোর মুহুর্ত") পর্যন্ত বিলম্ব রয়েছে। সেই বিলম্ব রোধ করতে, প্রদর্শিত হিসাবে একটি সুস্পষ্ট লেনদেন ব্লকে কমান্ডটি মোড়ক করুন। এই কাজটি সরবরাহ করে যে বর্তমান রানলুপে এই স্তরটিতে অন্য কোনও পরিবর্তন সম্পাদিত হয়নি।


2
আমি আপনার কোড পরে [CATransaction ফ্লাশ] ব্যবহার করে যা দুর্দান্ত কাজ করে, কখনও কখনও তা তাত্ক্ষণিকভাবে না লেখার কারণ হয়। তবে যাইহোক, একটি 0.1 সেকেন্ডের পারফরম্যান্স সমস্যা রয়েছে, উদাহরণস্বরূপ এটি সেই নির্দিষ্ট সময়ের জন্য পিছিয়ে। কোন workaround?
সিডউইন কোহ

5
removeAllAnimationsঅ্যানিমেশনটি এখনই যেখানে রয়েছে সেখানে থামানোর পরিবর্তে এটি চূড়ান্ত ফ্রেমে আনার পার্শ্ব প্রতিক্রিয়াটি দেখাবে will
ইলিয়া

3
সাধারণত, যখন কেউ কোনও অ্যানিমেশনটি থামতে চায়, তখন তারা এটি তার বর্তমান ফ্রেমে থামার প্রত্যাশা করে - প্রথম ফ্রেম বা শেষ ফ্রেম নয়। প্রথম বা শেষ ফ্রেমে জাম্পিং ঝাঁকুনির গতির মতো দেখাবে।
ইলিয়া

1
আমি তখন ডিফল্ট আচরণটি কী এবং এটি কীভাবে পরিবর্তন করা যায় তা নির্দিষ্ট করার জন্য আমি উত্তরটি বিস্তারিত করব। স্পষ্টতই যে কেউ অ্যানিমেশন করছেন তার পদ্ধতি কল করার পরে স্ক্রিনে যা ঘটে তাতে সক্রিয়ভাবে আগ্রহী :)
ইলিয়া

1
আমি অন্য কোথাও এটি বিস্তারিত আছে। এটি যা জিজ্ঞাসা করা হয়েছিল তা নয় তাই আমি এখানে যা উত্তর দিয়েছি তা তা নয়। আপনার যদি অন্য উত্তর থাকে তবে অবশ্যই উত্তর হিসাবে এটি দিন!
ম্যাট

48

আইওএস 4 এবং ততোধিক ক্ষেত্রে, প্রথম অ্যানিমেশনটি সংক্ষিপ্ত করতে দ্বিতীয় অ্যানিমেশনটিতে বিকল্পটি ব্যবহার করুনUIViewAnimationOptionBeginFromCurrentState

উদাহরণ হিসাবে, ধরে নিন আপনার কোনও ক্রিয়াকলাপ সূচক সহ একটি ভিউ রয়েছে। কিছু সম্ভাব্য সময় গ্রহণকারী ক্রিয়াকলাপ শুরু হওয়ার সময় আপনি ক্রিয়াকলাপের সূচকে বিবর্ণ হয়ে যেতে চান এবং ক্রিয়াকলাপ শেষ হয়ে গেলে এটিকে বিবর্ণ করতে চান। নীচের কোডে, এতে ক্রিয়াকলাপের সূচক সহ দর্শনটিকে বলা হয় activityView

- (void)showActivityIndicator {
    activityView.alpha = 0.0;
    activityView.hidden = NO;
    [UIView animateWithDuration:0.5
                 animations:^(void) {
                     activityView.alpha = 1.0;
                 }];

- (void)hideActivityIndicator {
    [UIView animateWithDuration:0.5
                 delay:0 options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^(void) {
                     activityView.alpha = 0.0;
                 }
                 completion:^(BOOL completed) {
                     if (completed) {
                         activityView.hidden = YES;
                     }
                 }];
}

41

একটি অ্যানিমেশন বাতিল করতে আপনার কেবলমাত্র ইউআইভিউ অ্যানিমেশনের বাইরে বর্তমানে যে বৈশিষ্ট্যটি অ্যানিমেটেড করা হচ্ছে সেট করা দরকার। এটি অ্যানিমেশনটি যেখানেই থাকুক না কেন থামিয়ে দেবে, এবং ইউআইভিউউ আপনার সুনির্দিষ্টভাবে নির্ধারিত সেটিংটিতে চলে যাবে।


9
এটি কেবল আংশিক সত্য। এটি অ্যানিমেশনটি থামায়, তবে এটি প্রতিনিধি পদ্ধতিগুলিকে গুলি চালানো থেকে বিরত রাখে না, উল্লেখযোগ্যভাবে, অ্যানিমেশন কমপ্লিট হ্যান্ডলার, সুতরাং আপনার যদি যুক্তি থাকে তবে আপনি সমস্যাগুলি দেখতে পাবেন।
এম রায়ান

33
এটিই 'সমাপ্ত' যুক্তিটির -animationDidStop:finished:context:পক্ষে। যদি [finished boolValue] == NO, তবে আপনি জানেন যে আপনার অ্যানিমেশনটি কোনওভাবে বাতিল হয়ে গিয়েছিল।
নিক ফোরজি

এটি 7 বছর আগে থেকে দুর্দান্ত টিপ! একটি অদ্ভুত আচরণ আছে তা নোট করুন: বলুন যে আপনি আলফাটি পিছনে এবং সামনে অ্যানিমেট করছেন এবং আপনি এটিকে "0 এ যান" বানাচ্ছেন। অ্যানিমেশন থামাতে, আপনি শূন্যের সাথে আলফা সেট করতে পারবেন না; আপনি এটিকে ১ হিসাবে সেট করেছেন
ফ্যাটি

26

এই উত্তরটি পুনরুত্থিত করার জন্য দুঃখিত, তবে আইওএসে 10 টি জিনিস কিন্ডার পরিবর্তিত হয়েছে, এবং এখন বাতিল করা সম্ভব এবং আপনি এমনকি কৌতুকপূর্ণভাবে বাতিল করতে পারেন!

আইওএস 10 এর পরে আপনি ইউআইভিউপ্রোপার্টিএনিমেটরের সাথে অ্যানিমেশনগুলি বাতিল করতে পারেন !

UIViewPropertyAnimator(duration: 2, dampingRatio: 0.4, animations: {
    view.backgroundColor = .blue
})
animator.stopAnimation(true)

আপনি যদি সত্যটি পাস করেন তবে এটি অ্যানিমেশনটি বাতিল করে এবং এটি যেখানেই বাতিল করেছিলেন ঠিক সেখানেই এটি থামবে। সমাপ্তির পদ্ধতিটি কল করা হবে না। তবে, আপনি যদি মিথ্যা পাস করেন তবে অ্যানিমেশনটি শেষ করার জন্য আপনি দায়বদ্ধ:

animator.finishAnimation(.start)

আপনি আপনার অ্যানিমেশনটি শেষ করতে এবং বর্তমান অবস্থায় (.কালীন) থাকতে পারেন বা প্রাথমিক অবস্থায় (। স্টার্ট) অথবা শেষ অবস্থায় (.end) যেতে পারেন

যাইহোক, আপনি এমনকি বিরতি দিতে এবং পরে পুনরায় চালু করতে পারেন ...

animator.pauseAnimation()
animator.startAnimation()

দ্রষ্টব্য: আপনি যদি আকস্মিক বাতিল বাতিল না চান তবে আপনি আপনার অ্যানিমেশনটি বিপরীত করতে পারেন বা এমনকি আপনার অ্যানিমেশনটি বিরতি দেওয়ার পরেও পরিবর্তন করতে পারবেন!


2
এটি অবশ্যই আধুনিক অ্যানিমেশনগুলির জন্য সবচেয়ে প্রাসঙ্গিক।
ডগ

10

আপনি যদি ভিউ প্রোপার্টিটির পরিবর্তে ধ্রুবক পরিবর্তন করে কোনও প্রতিবন্ধকতা সঞ্চার করছেন তবে অন্য কোনও পদ্ধতি আইওএস 8 এ কাজ করে না।

অ্যানিমেশন উদাহরণ:

self.constraint.constant = 0;
[self.view updateConstraintsIfNeeded];
[self.view layoutIfNeeded];
[UIView animateWithDuration:1.0f
                      delay:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     self.constraint.constant = 1.0f;
                     [self.view layoutIfNeeded];
                 } completion:^(BOOL finished) {

                 }];

সমাধান:

সীমাবদ্ধতা পরিবর্তন এবং তাদের সাবলেয়ারগুলি দ্বারা প্রভাবিত হওয়া কোনও ভিউয়ের স্তরগুলি থেকে আপনাকে অ্যানিমেশনগুলি সরিয়ে ফেলতে হবে।

[self.constraintView.layer removeAllAnimations];
for (CALayer *l in self.constraintView.layer.sublayers)
{
    [l removeAllAnimations];
}

1
এছাড়াও কেবল self.constraintView.layer.removeAllAnimations()কাজ করে (সুইফ্ট)
লাচ্টান

অন্যান্য সমাধানগুলির কোনওটিই কাজ করেনি han ধন্যবাদ, এটি আমার পক্ষে কাজ করে।
স্বপ্নিলাগারওয়াল


5

উপরের কোনওটিই আমার জন্য এটি সমাধান করেনি, তবে এটি সহায়তা করেছে: UIViewঅ্যানিমেশনটি তাত্ক্ষণিকভাবে সম্পত্তি সেট করে, তারপরে এনিমেট করে। উপস্থাপনা স্তরটি মডেলের (সেট সম্পত্তি) সাথে মেলে এটি অ্যানিমেশনটি থামায় s

আমি আমার সমস্যাটি সমাধান করেছি, যা ছিল "আমি যেখানে দেখাতে চাইছি সেখান থেকে সঞ্চারিত করতে চাই" ('আপনি' দর্শনটির অর্থ)। যদি আপনি এটি চান, তবে:

  1. কোয়ার্টজকোর যুক্ত করুন।
  2. CALayer * pLayer = theView.layer.presentationLayer;

উপস্থাপনা স্তর অবস্থান নির্ধারণ করুন

আমি সহ কয়েকটি বিকল্প ব্যবহার করি UIViewAnimationOptionOverrideInheritedDuration

তবে অ্যাপলের ডকুমেন্টেশনটি অস্পষ্ট বলে আমি জানি না এটি ব্যবহারের সময় এটি অন্যান্য অ্যানিমেশনগুলিকে সত্যিই ওভাররাইড করে কিনা, বা কেবল টাইমারগুলি পুনরায় সেট করে।

[UIView animateWithDuration:blah... 
                    options: UIViewAnimationOptionBeginFromCurrentState ... 
                    animations: ^ {
                                   theView.center = CGPointMake( pLayer.position.x + YOUR_ANIMATION_OFFSET, pLayer.position.y + ANOTHER_ANIMATION_OFFSET);
                   //this only works for translating, but you get the idea if you wanna flip and scale it. 
                   } completion: ^(BOOL complete) {}];

এবং এটি আপাতত একটি শালীন সমাধান হওয়া উচিত।


5
[UIView setAnimationsEnabled:NO];
// your code here
[UIView setAnimationsEnabled:YES];

2

স্টিফেন ডার্লিংটনের সমাধানটির সুইফ্ট সংস্করণ

UIView.beginAnimations(nil, context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(0.1)
// other animation properties

// set view properties
UIView.commitAnimations()

1

আমি একই সমস্যা আছে; এপিআইগুলিতে কিছু নির্দিষ্ট অ্যানিমেশন বাতিল করার মতো কিছু নেই। দ্য

+ (void)setAnimationsEnabled:(BOOL)enabled

সমস্ত অ্যানিমেশন অক্ষম করে এবং এইভাবে আমার পক্ষে কাজ করে না। দুটি সমাধান রয়েছে:

1) আপনার অ্যানিমেটেড বস্তুটিকে একটি উপদর্শন করুন। তারপরে, আপনি যখন এই দৃশ্যের জন্য অ্যানিমেশনগুলি বাতিল করতে চান, তখন দৃশ্যটি সরিয়ে ফেলুন বা এটি লুকিয়ে রাখুন। খুব সাধারণ, তবে সাবউভিউটি অ্যানিমেশন ছাড়াই পুনরায় তৈরি করা দরকার যদি আপনার এটিকে সামনে রাখার প্রয়োজন হয়।

২) অ্যানিমকে কেবল একটির পুনরাবৃত্তি করুন, এবং প্রয়োজনে এনিমটি পুনরায় চালু করার জন্য একটি প্রতিনিধি নির্বাচিত করুন, এটির মতো:

-(void) startAnimation {
NSLog(@"startAnim alpha:%f", self.alpha);
[self setAlpha:1.0];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationRepeatCount:1];
[UIView setAnimationRepeatAutoreverses:YES];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(pulseAnimationDidStop:finished:context:)];
[self setAlpha:0.1];
[UIView commitAnimations];
}

- (void)pulseAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
if(hasFocus) {
    [self startAnimation];
} else {
    self.alpha = 1.0;
}
}

-(void) setHasFocus:(BOOL)_hasFocus {
hasFocus = _hasFocus;
if(hasFocus) {
    [self startAnimation];
}
}

২) এর সাথে সমস্যাটি হ'ল এনিমটি বর্তমান অ্যানিমেশন চক্রটি শেষ করার সাথে সাথে এনিমকে থামাতে সবসময় দেরি হয়।

আশাকরি এটা সাহায্য করবে.


1

এমনকি আপনি যদি উপরে অ্যানিমেশনটি চালিয়ে যান তবে অ্যানিমেশনটি বাতিল হয় didStopSelector। সুতরাং অ্যানিমেশন দ্বারা চালিত আপনার অ্যাপ্লিকেশনটিতে আপনার যদি যুক্তিযুক্ত রাজ্য থাকে তবে আপনার সমস্যা হবে। উপরে বর্ণিত পদ্ধতিগুলির সাথে এই কারণে আমি UIViewঅ্যানিমেশনের প্রসঙ্গের পরিবর্তনশীল ব্যবহার করি । আপনি যদি অ্যানিমেশনটিতে প্রসঙ্গের পরম দ্বারা আপনার প্রোগ্রামের বর্তমান অবস্থাটি পাস করেন, যখন অ্যানিমেশনটি আপনার didStopSelectorফাংশনটি থামিয়ে দেয় তখন সিদ্ধান্ত নিতে পারে এটি কিছু করা উচিত বা স্রেফ বর্তমান অবস্থা এবং প্রসঙ্গ হিসাবে রাষ্ট্রের মানের উপর ভিত্তি করে ফিরে আসে।


টমটেলরের সঠিক উত্তরের নীচে দেওয়া মন্তব্যে নিকফর্জ এটিকে পুরোপুরি ব্যাখ্যা করেছেন ...
ফ্যাটি

এই নোটের জন্য অনেক ধন্যবাদ! আমার প্রকৃতপক্ষে এমন পরিস্থিতি রয়েছে, যেখানে অ্যানিমেশনডিডস্টপ কল করার পরে একটি পরবর্তী অ্যানিমেশন বন্ধ হয়ে যায়। যদি আপনি কেবল একটি অ্যানিমেশন সরান এবং তত্ক্ষণাত একই কীটির জন্য একটি নতুন যুক্ত করেন তবে আমি দেখতে পাই এটি কার্যকর হবে না। আপনাকে অপেক্ষা করতে হবে, উদাহরণস্বরূপ অ্যানিমেশনডিসটপ অন্য অ্যানিমেশন বা অন্য কোনও কিছুর জন্য ট্রিগার করে। সবে সরিয়ে নেওয়া অ্যানিমেশনটি অ্যানিমেশনটিকে আর চালিত করবে না।
রিকজ্যানসেন


0

মূল বা চূড়ান্ত স্থিতিতে না ফিরে কোনও অ্যানিমেশনকে বিরতি দেওয়ার জন্য:

CFTimeInterval paused_time = [myView.layer convertTime:CACurrentMediaTime() fromLayer:nil];
myView.layer.speed = 0.0;
myView.layer.timeOffset = paused_time;

0

আমি যখন UIStackViewঅ্যানিমেশন দিয়ে কাজ করি , ততক্ষণে removeAllAnimations()আমার প্রাথমিক মানগুলিতে কিছু মান সেট করা দরকার কারণ removeAllAnimations()সেগুলি অনির্দেশ্য স্থানে সেট করতে পারে। আমার stackViewসাথে view1এবং view2ভিতরে রয়েছে এবং একটি দৃশ্য দৃশ্যমান এবং একটি লুকানো উচিত:

public func configureStackView(hideView1: Bool, hideView2: Bool) {
    let oldHideView1 = view1.isHidden
    let oldHideView2 = view2.isHidden
    view1.layer.removeAllAnimations()
    view2.layer.removeAllAnimations()
    view.layer.removeAllAnimations()
    stackView.layer.removeAllAnimations()
    // after stopping animation the values are unpredictable, so set values to old
    view1.isHidden = oldHideView1 //    <- Solution is here
    view2.isHidden = oldHideView2 //    <- Solution is here

    UIView.animate(withDuration: 0.3,
                   delay: 0.0,
                   usingSpringWithDamping: 0.9,
                   initialSpringVelocity: 1,
                   options: [],
                   animations: {
                    view1.isHidden = hideView1
                    view2.isHidden = hideView2
                    stackView.layoutIfNeeded()
    },
                   completion: nil)
}

0

উত্তরযুক্ত সমাধানগুলির মধ্যে আমার পক্ষে কাজ হয়নি। আমি আমার সমস্যাগুলি এইভাবে সমাধান করেছি (আমি জানি না এটি একটি সঠিক উপায় কিনা?), কারণ এটি খুব দ্রুত কল করার সময় আমার সমস্যা হয়েছিল (যখন পূর্ববর্তী অ্যানিমেশনটি এখনও শেষ হয়নি)। আমি কাস্টমঅ্যানিম ব্লক সহ আমার পছন্দসই অ্যানিমেশনটি পাস করি ।

extension UIView
{

    func niceCustomTranstion(
        duration: CGFloat = 0.3,
        options: UIView.AnimationOptions = .transitionCrossDissolve,
        customAnim: @escaping () -> Void
        )
    {
        UIView.transition(
            with: self,
            duration: TimeInterval(duration),
            options: options,
            animations: {
                customAnim()
        },
            completion: { (finished) in
                if !finished
                {
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    // NOTE: This fixes possible flickering ON FAST TAPPINGS
                    self.layer.removeAllAnimations()
                    customAnim()
                }
        })

    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.