viewDidAppear হল UIViewController-এর একটি মেথড যা UIKit কল করে যখন স্ক্রিন সম্পূর্ণরূপে ডিসপ্লেতে উপস্থিত হয়েছে এবং সমস্ত ট্রানজিশন অ্যানিমেশন শেষ হয়েছে। Apple Developer Documentation-এর মতে, এই মেথড গ্যারান্টি দেয় যে View ব্যবহারকারীর কাছে দৃশ্যমান এবং ইন্টারঅ্যাকশনের জন্য প্রস্তুত। viewDidAppear অ্যানিমেশন, ট্র্যাকিং এবং অ্যাসিনক্রোনাস অপারেশন শুরু করার জন্য সর্বোত্তম স্থান।
মূল বিষয়
viewDidAppear হল UIViewController-এর একটি মেথড যা UIKit কল করে যখন View উইন্ডো হায়ারার্কিতে যোগ করা হয়েছে এবং ট্রানজিশন অ্যানিমেশন সম্পূর্ণরূপে শেষ হয়েছে। এই মুহূর্তে, স্ক্রিন তার চূড়ান্ত অবস্থায় থাকে: এটি দৃশ্যমান, এর সাথে ইন্টারঅ্যাক্ট করা যায় এবং সমস্ত UIKit অ্যানিমেশন বন্ধ হয়ে গেছে। ডেভেলপার এই মেথডটি ওভাররাইড করে এমন কাজ সম্পাদনের জন্য যার জন্য স্ক্রিনটি ব্যবহারকারীর চোখের সামনে থাকা নিশ্চিত প্রয়োজন।
viewWillAppear-এর বিপরীতে, যেখানে স্ক্রিন শুধু দেখানোর জন্য প্রস্তুতি নিচ্ছে, viewDidAppear ইঙ্গিত দেয় যে ব্যবহারকারী ইতিমধ্যে ইন্টারফেস দেখছেন। এটি একটি গুরুত্বপূর্ণ পার্থক্য: viewWillAppear-এ অ্যানিমেশন শুরু করলে ফ্রেম ড্রপ হতে পারে কারণ UIKit এখনও ট্রানজিশন প্রক্রিয়া করছে। viewDidAppear-এ, ট্রানজিশন সম্পূর্ণ এবং কন্ট্রোলারের রিসোর্সগুলি নতুন কন্টেন্ট রেন্ডার করতে ব্যবহার করা যেতে পারে।
মেথডটি viewWillAppear-এর অনুরূপ, Bool টাইপের একটি animated প্যারামিটার গ্রহণ করে। যদি true হয়, তাহলে স্ক্রিনের উপস্থিতি অ্যানিমেশন সহ ছিল। এই প্যারামিটারটি UI আচরণ অভিযোজিত করতে ব্যবহার করা যেতে পারে: উদাহরণস্বরূপ, একটি অ-অ্যানিমেটেড প্রত্যাবর্তনের সময় প্রবেশ অ্যানিমেশন এড়িয়ে যাওয়া।
viewDidAppear সমস্ত পরিস্থিতিতে কল করা হয় যেখানে স্ক্রিন তার উপস্থিতি প্রক্রিয়া সম্পূর্ণ করেছে। আসুন iOS ডেভেলপারের দৃষ্টিকোণ থেকে মূল ক্ষেত্রগুলি দেখি।
UINavigationController একটি push বা pop অ্যানিমেশন শেষ করার পরে, লক্ষ্য কন্ট্রোলারে viewDidAppear কল করা হয়। স্ট্যাকের প্রথম স্ক্রিনের জন্য, এটি প্রাথমিক খোলার অ্যানিমেশনের পরে চালু হয়। এটি প্রধান পরিস্থিতি, এবং viewDidAppear-এ লজিক রাখার সময় ডেভেলপাররা মূলত এটিকেই লক্ষ্য করে থাকেন।
যখন ব্যবহারকারী একটি মডালি উপস্থাপিত কন্ট্রোলার বন্ধ করে এবং আগেরটিতে ফিরে আসে, তখন UIKit ফিরে আসা কন্ট্রোলারে viewDidAppear কল করে। animated প্যারামিটারটি এর সাথে সামঞ্জস্যপূর্ণ হবে যে dismiss অ্যানিমেশন সহ করা হয়েছিল কিনা। এই মুহূর্তটি চাইল্ড স্ক্রিন থেকে ডেটা পাওয়ার পরে UI আপডেট করার জন্য গুরুত্বপূর্ণ।
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
logScreenView()
startOnboardingAnimation()
}
UITabBarController স্যুইচ অ্যানিমেশন সম্পূর্ণ হওয়ার পরে নির্বাচিত ট্যাবের কন্ট্রোলারে viewDidAppear কল করে। এটি viewWillAppear থেকে ভিন্ন, যা স্যুইচ শুরু হলে চালু হয়। যদি কোনো ট্যাবে স্বাগত অ্যানিমেশন থাকে বা আপনার সক্রিয় সময় ট্র্যাক করার প্রয়োজন হয়, viewDidAppear সঠিক স্থান।
যখন অ্যাপ ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ডে ফিরে আসে, দৃশ্যমান কন্ট্রোলারে viewWillAppear এবং viewDidAppear কল হতে পারে যদি View-এর জীবনচক্র অস্থায়ীভাবে স্থগিত করা হয়েছিল। তবে, ব্যাকগ্রাউন্ড থেকে ফিরে আসার নির্ভরযোগ্য ট্র্যাকিংয়ের জন্য, আলাদাভাবে UIApplication.willEnterForegroundNotification ব্যবহার করুন।
viewDidAppear এমন কাজগুলি পরিচালনা করে যার সঠিক সম্পাদনের জন্য একটি দৃশ্যমান স্ক্রিন প্রয়োজন। আসুন বাস্তব প্রকল্পগুলিতে মূল ব্যবহারের পরিস্থিতি দেখি।
viewDidAppear-এর সবচেয়ে সাধারণ কাজ হল স্ক্রিন ভিউ ট্র্যাকিং। Firebase Analytics, Amplitude বা Mixpanel-এর মতো অ্যানালিটিক্স সিস্টেমগুলি শুধুমাত্র স্ক্রিনটি ব্যবহারকারীকে প্রকৃতপক্ষে দেখানোর পরে ইভেন্ট গ্রহণ করা উচিত। viewWillAppear-এ ইভেন্ট পাঠানো দেখার সময়কে কমিয়ে দিতে পারে এবং মিথ্যা সক্রিয়তা তৈরি করতে পারে।
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
Analytics.logEvent(
name: "screen_view",
parameters: [
"screen_name": "ProfileScreen",
"screen_class": String(describing: self)
]
)
}
যে অ্যানিমেশনগুলি স্ক্রিন প্রদর্শিত হওয়ার পরে শুরু হওয়া উচিত — উপাদানের ক্রমিক উপস্থিতি, প্যারালাক্স, টিউটোরিয়াল — viewDidAppear-এ শুরু করা হয়। এই মুহূর্তে, গ্রাফিক্স কনটেক্সট সম্পূর্ণরূপে প্রস্তুত, এবং অ্যানিমেশন শুরুতে ফ্রেম ড্রপ ছাড়াই মসৃণ হবে। এটি UIViewPropertyAnimator ব্যবহার করে অ্যানিমেশনের জন্য বিশেষভাবে গুরুত্বপূর্ণ।
ভারী অ্যাসিনক্রোনাস অপারেশন — উচ্চ-রেজোলিউশন ছবি লোড করা, বড় JSON পার্স করা, ভিডিও আরম্ভ করা — viewDidLoad বা viewWillAppear-এর পরিবর্তে viewDidAppear-এ শুরু করা ভাল। মেথডটি কল করার সময়, ব্যবহারকারী ইতিমধ্যে ইন্টারফেস দেখছেন, তাই আপনি স্ক্রিন উপস্থিতিতে বিলম্ব না করে স্কেলেটন বা লোডার দেখাতে পারেন।
যদি স্ক্রিনে এমন উপাদান থাকে যার পর্যায়ক্রমিক আপডেট প্রয়োজন — কাউন্টডাউন টাইমার, প্রগতি নির্দেশক, প্রগতি অ্যানিমেশন — সেগুলি viewDidAppear-এ শুরু করা হয় এবং viewDidDisappear-এ বন্ধ করা হয়। এটি স্ক্রিন অদৃশ্য থাকাকালীন টাইমার চালানো প্রতিরোধ করে, ব্যাটারি লাইফ এবং CPU রিসোর্স সাশ্রয় করে।
মিডিয়া কন্টেন্ট — ভিডিও, অডিও, Lottie অ্যানিমেশন — viewDidAppear-এ শুরু করা হয়, আগে নয়। আপনি যদি viewWillAppear-এ প্লেব্যাক শুরু করেন, ব্যবহারকারী প্রথম কয়েক সেকেন্ড মিস করবে যখন স্ক্রিন এখনও প্রদর্শিত হচ্ছে। viewDidAppear-এ, আপনি আত্মবিশ্বাসের সাথে AVPlayer বা Lottie অ্যানিমেশন শুরু করতে পারেন যে ব্যবহারকারী প্রথম ফ্রেম থেকে কন্টেন্ট দেখছেন। এটি অনবোর্ডিং স্ক্রিন এবং স্প্ল্যাশ স্ক্রিনের জন্য বিশেষভাবে গুরুত্বপূর্ণ যেখানে সঠিক সময় নির্ধারণ গুরুত্বপূর্ণ।
অ্যানিমেশন শুরু করার সঠিক সময় সরাসরি ইন্টারফেসের মসৃণতার ধারণাকে প্রভাবিত করে। সাধারণ অ্যানিমেশনের জন্য viewWillAppear এবং viewDidAppear-এ শুরু করার পার্থক্য অলক্ষিত হতে পারে, কিন্তু জটিল দৃশ্যের জন্য এটি গুরুত্বপূর্ণ হয়ে ওঠে।
যখন UIKit স্ক্রিনের মধ্যে push ট্রানজিশন করে, এটি স্ক্রিনশট নেয়, সেগুলিকে অ্যানিমেট করে এবং একই সাথে নতুন কন্ট্রোলারে viewWillAppear কল করে। আপনি যদি এই মুহূর্তে একটি ভারী অ্যানিমেশন শুরু করেন — প্যারালাক্স, ব্লার, ট্রান্সফর্মেশন — UIKit ট্রানজিশন অ্যানিমেশনের ফ্রেম ড্রপ করতে পারে, একটি ঝাঁকুনিপূর্ণ প্রভাব তৈরি করে। viewDidAppear গ্যারান্টি দেয় যে ট্রানজিশন অ্যানিমেশন সম্পূর্ণ, আপনাকে রেন্ডারিংয়ের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়।
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
UIView.animate(
withDuration: 0.6,
delay: 0.3,
usingSpringWithDamping: 0.8,
initialSpringVelocity: 0.5
) {
self.cardView.alpha = 1.0
self.cardView.transform = .identity
}
}
উপাদানগুলির প্রাকৃতিক ক্যাসকেডিং উপস্থিতি তৈরি করতে বিলম্ব এবং ড্যাম্পিং ব্যবহার করুন। এই পদ্ধতি ইন্টারফেস ধারণা উন্নত করে এবং dwell time বাড়ায় — ব্যবহারকারীরা কন্টেন্ট অন্বেষণে আরও সময় ব্যয় করেন, যা আচরণগত মেট্রিক্সে ইতিবাচক প্রভাব ফেলে।
ভুল ব্যবহার viewDidAppear কর্মক্ষমতা সমস্যা, অ্যানিমেশনের অপ্রত্যাশিত আচরণ এবং অত্যধিক ট্র্যাকিংয়ের কারণ হতে পারে। আসুন সাধারণ ভুলগুলি দেখি।
প্রথম ভুল হল একাধিক কল। কিছু পরিস্থিতিতে viewDidAppear একাধিকবার কল হতে পারে: ট্যাব স্যুইচ করা, ব্যাকগ্রাউন্ড থেকে ফিরে আসা, মডাল ট্রানজিশন। যদি মেথডটি একটি ফ্ল্যাগ চেক ছাড়া একটি ভারী অপারেশন করে, তবে এটি নকল হবে। একবারের কাজের জন্য hasAppeared ফ্ল্যাগ বা dispatchOnce ব্যবহার করুন।
দ্বিতীয় ভুল হল লুকানোর সময় বাতিল না করে নেটওয়ার্ক অনুরোধ শুরু করা। যদি ব্যবহারকারী অনুরোধ শেষ হওয়ার আগে স্ক্রিন ছেড়ে চলে যায়, ফলাফলটি ইতিমধ্যে লুকানো View-তে প্রয়োগ হতে পারে। বাতিলযোগ্য URLSessionTask ব্যবহার করুন এবং viewDidDisappear-এ সেগুলি বাতিল করুন।
তৃতীয় ভুল হল viewDidAppear-এর পরিবর্তে viewWillAppear-এ ট্র্যাকিং করা। কিছু ডেভেলপার viewWillAppear-এ অ্যানালিটিক্স ইভেন্ট পাঠান, কিন্তু এটি মিথ্যা সক্রিয়তা তৈরি করে যদি স্ক্রিন প্রদর্শিত না হয় (উদাহরণস্বরূপ, একটি বাতিল pop জেসচারের কারণে)। viewDidAppear একমাত্র নির্ভরযোগ্য নির্দেশক যে ব্যবহারকারী প্রকৃতপক্ষে স্ক্রিন দেখেছেন।
চতুর্থ ভুল হল super ভুলে যাওয়া। UINavigationController, UITabBarController এবং UISplitViewController-এর সঠিক কাজের জন্য super.viewDidAppear কল করা প্রয়োজন। এটি ছাড়া, মানক নেভিগেশন এবং ইন্টারফেস আপডেট প্রক্রিয়া ভেঙে যেতে পারে।
পঞ্চম ভুল হল viewDidLayoutSubviews বিবেচনা না করে ওরিয়েন্টেশন বা স্ক্রিন আকার পরিবর্তন করা। যদি viewDidAppear-এ আপনার অ্যানিমেশন View-এর চূড়ান্ত মাত্রার উপর নির্ভর করে, মনে রাখবেন viewDidLayoutSubviews viewDidAppear-এর আগে একাধিকবার কল হতে পারে। প্রথম স্ক্রিন উপস্থিতিতে, viewDidAppear কল হওয়ার আগে লেআউট সম্পূর্ণ হয়, কিন্তু পরবর্তী আকার পরিবর্তনে — উদাহরণস্বরূপ, ডিভাইস রোটেশনে — viewDidAppear কল নাও হতে পারে এবং আপনার অ্যানিমেশন শুরু হবে না। এই ধরনের ক্ষেত্রে, firstLayout ফ্ল্যাগ চেক সহ viewDidLayoutSubviews ব্যবহার করুন।
সঠিক বাস্তবায়নে অ্যানিমেশন অবজেক্টের একটি রেফারেন্স রাখা এবং স্ক্রিন ছেড়ে যাওয়ার সময় এটি স্পষ্টভাবে বাতিল করা জড়িত। ষষ্ঠ ভুল হল স্টপ ফ্ল্যাগ ছাড়া অসীম অ্যানিমেশন শুরু করা। আপনি যদি viewDidAppear-এ একটি পুনরাবৃত্ত অ্যানিমেশন শুরু করেন (যেমন, একটি স্পন্দিত নির্দেশক বা ঘূর্ণায়মান লোডার) কিন্তু viewDidDisappear-এ এটি বন্ধ না করেন, অ্যানিমেশন স্ক্রিন লুকানো থাকলেও GPU রিসোর্স ব্যবহার করবে। সর্বদা সক্রিয় অ্যানিমেশনের একটি রেফারেন্স রাখুন এবং সংশ্লিষ্ট জীবনচক্র মেথডে removeAllAnimations বা setCompletion কল করুন।
সপ্তম ভুল হল কার্যকলাপ বন্ধ করার জন্য viewDidDisappear উপেক্ষা করা। আপনি যদি viewDidAppear-এ GPS, অ্যাক্সিলেরোমিটার বা গাইরোস্কোপ শোনা শুরু করে থাকেন, তাহলে viewDidDisappear-এ এটি বন্ধ করতে ভুলবেন না। অন্যথায়, সেন্সরগুলি ব্যাকগ্রাউন্ডে কাজ করতে থাকবে, ব্যাটারি নিষ্কাশন করবে, এমনকি যদি ব্যবহারকারী অনেক আগে অন্য স্ক্রিনে চলে গেছে। সংশ্লিষ্ট জীবনচক্র মেথডগুলিতে যুগ্ম শুরু এবং বন্ধ কল ব্যবহার করুন — এটি ডিভাইসে সঠিক রিসোর্স ব্যবস্থাপনার গ্যারান্টি দেয়।
সচরাচর জিজ্ঞাসিত প্রশ্ন
viewWillAppear উপস্থিতি অ্যানিমেশনের আগে কল করা হয়, যখন স্ক্রিন এখনও দৃশ্যমান নয়। viewDidAppear অ্যানিমেশন সম্পূর্ণরূপে শেষ হওয়ার পরে কল করা হয়, যখন স্ক্রিন দৃশ্যমান এবং ইন্টারঅ্যাকশনের জন্য উপলব্ধ।
viewDidAppear-এ, UIKit-এর ট্রানজিশন অ্যানিমেশন ইতিমধ্যে শেষ হয়েছে এবং সমস্ত রেন্ডারিং রিসোর্স আপনার কন্ট্রোলারের জন্য উপলব্ধ। আগে অ্যানিমেশন শুরু করলে ফ্রেম ড্রপ এবং ঝাঁকুনিপূর্ণ ইন্টারফেস হতে পারে।
সাধারণ জীবনচক্রে, না — viewDidAppear সবসময় viewWillAppear-কে অনুসরণ করে। তবে, কিছু অবস্থা পুনরুদ্ধারের পরিস্থিতিতে, সিস্টেম শুধুমাত্র viewDidAppear কল করতে পারে।
firstAppearance-এর জন্য একটি ফ্ল্যাগ চেক যোগ করুন বা একটি কাউন্টার এবং স্ক্রিন নামের সংমিশ্রণ ব্যবহার করুন। উদাহরণস্বরূপ, শুধুমাত্র যখন firstAppearance = true তখন screen_view ইভেন্ট পাঠান, তারপর ফ্ল্যাগ রিসেট করুন।
ব্যাকগ্রাউন্ড থেকে ফিরে আসার সময়, UIKit দৃশ্যমান কন্ট্রোলারে viewDidAppear কল করতে পারে যদি View মেমোরি থেকে আনলোড করা হয়েছিল। নির্ভরযোগ্য ট্র্যাকিংয়ের জন্য, AppDelegate নোটিফিকেশন ব্যবহার করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন