UIKit হলো iOS এবং macOS অ্যাপ্লিকেশনে গ্রাফিকাল ইন্টারফেস তৈরির একটি ফ্রেমওয়ার্ক। সেটটিতে UIView, UIViewController, নিয়ন্ত্রণ উপাদান এবং Auto Layout সিস্টেম অন্তর্ভুক্ত রয়েছে, যা অভিযোজিত এবং ইন্টারঅ্যাকটিভ স্ক্রিন তৈরি করতে সক্ষম করে। Apple Developer Documentation (2025) অনুসারে, UIKit-এ উইন্ডো, ভিউ, অ্যানিমেশন, জেসচার এবং টেক্সট নিয়ে কাজ করার জন্য ২০০টিরও বেশি ক্লাস রয়েছে — এটি সমস্ত iPhone এবং iPad অ্যাপ্লিকেশনের ভিত্তি।
মূল পয়েন্ট
UIKit হলো Apple-এর একটি ফ্রেমওয়ার্ক যা iOS, iPadOS এবং macOS-এ (Mac Catalyst-এর মাধ্যমে) ইউজার ইন্টারফেস তৈরি এবং পরিচালনার জন্য ক্লাস প্রদান করে। এটি Core Animation, Core Graphics এবং Quartz Core-এর উপরে কাজ করে, নিম্ন-স্তরের রেন্ডারিংকে উচ্চ-স্তরের অবজেক্ট — বাটন, লেবেল, ইমেজ এবং কন্টেইনারে বিমূর্ত করে। UIKit iPhone OS 1-এর সাথে ২০০৭ সালে শুরু হয়েছিল এবং SwiftUI-এর পাশাপাশি iOS ডেভেলপমেন্টের জন্য প্রাথমিক ফ্রেমওয়ার্ক হিসেবে রয়ে গেছে।
ফ্রেমওয়ার্কটি একটি আবশ্যিক পদ্ধতি অনুসরণ করে: ডেভেলপার UIButton, UILabel, UIImageView ক্লাসের ইনস্ট্যান্স তৈরি করে, তাদের বৈশিষ্ট্য (রং, ফন্ট, অবস্থান) সেট করে এবং addSubview-এর মাধ্যমে ভিউ পিরামিডে যুক্ত করে। ইন্টারফেসের প্রতিটি পরিবর্তন স্পষ্টভাবে করা হয় — পর্দার আড়ালে কোনো জাদু আপডেট নেই। এটি UIKit-কে SwiftUI-এর মতো ঘোষণামূলক ফ্রেমওয়ার্ক থেকে আলাদা করে, যেখানে অবস্থা বর্ণনা স্বয়ংক্রিয়ভাবে ইন্টারফেস পুনরায় আঁকে।
ফ্রেমওয়ার্কটিতে ক্লাসের বেশ কয়েকটি বিভাগ অন্তর্ভুক্ত রয়েছে। UIView হলো মৌলিক উপাদান যা থেকে সমস্ত দৃশ্যমান কম্পোনেন্ট উত্তরাধিকার সূত্রে প্রাপ্ত হয়। UIWindow হলো শীর্ষ-স্তরের কন্টেইনার যার মাধ্যমে ভিউ স্ক্রিনে প্রদর্শিত হয়। UIViewController ভিউয়ের একটি সেট পরিচালনা করে এবং স্ক্রিন রোটেশন, কীবোর্ড দেখা দেওয়া এবং সিস্টেম বিজ্ঞপ্তিতে সাড়া দেয়। UIApplication হলো প্রবেশ বিন্দু যা টাচ ইভেন্ট এবং বাটন চাপ প্রক্রিয়া করে।
টেক্সটের জন্য UILabel (স্থির টেক্সট), UITextField (এক-লাইন ইনপুট), UITextView (মাল্টি-লাইন ইনপুট) ব্যবহার করা হয়। বাটনের জন্য — UIButton, যার মধ্যে সিস্টেম, কাস্টম এবং SF Symbols আইকনোগ্রাফি অন্তর্ভুক্ত। নেভিগেশনের জন্য — UINavigationController, UITabBarController এবং UISplitViewController। মোট, UIKit-এ ২০০টিরও বেশি পাবলিক ক্লাস রয়েছে।
UIKit আর্কিটেকচার স্তরের উপর নির্মিত: প্রতিটি স্তর প্রদর্শনের নিজস্ব দিকের জন্য দায়ী। সর্বনিম্ন স্তরে রয়েছে Core Graphics — পাথ, টেক্সট এবং ইমেজের জন্য রেন্ডারিং ইঞ্জিন। এর উপরে Core Animation, যা স্তর গঠন (CALayer) এবং অবস্থার মধ্যে অ্যানিমেশন পরিচালনা করে। UIKit তাদের উপরে একটি অবজেক্ট-ওরিয়েন্টেড API তৈরি করে: UIView, UIViewController এবং UIResponder।
প্রতিটি অ্যাপ্লিকেশনে একটি ভিউ পিরামিড থাকে — একটি গাছ যার মূল UIWindow। এর নীচে মূল UIViewController, তার ভিউ এবং ভিতরে নেস্টেড সাবভিউ থাকে। টাচ ইভেন্ট রেসপন্ডার চেইন বরাবর প্রচারিত হয়: সবচেয়ে গভীর নেস্টেড ভিউ থেকে তার প্যারেন্ট এবং উপরে UIApplication পর্যন্ত। যদি কোনো অবজেক্ট টাচ হ্যান্ডেল না করে, তবে এটি উপেক্ষা করা হয়।
প্রতিটি UIView-এ একটি CALayer থাকে যা স্ক্রিনে পিক্সেল রেন্ডারিং পরিচালনা করে। ভিউ টাচ এবং অ্যাক্সেসিবিলিটি পরিচালনা করে; স্তর গ্রাফিক্স — শ্যাডো, cornerRadius, বর্ডার, ট্রান্সফর্ম পরিচালনা করে। এই পৃথকীকরণ ভারী গ্রাফিক্সকে মূল থ্রেড ব্লক না করে একটি পৃথক থ্রেডে (রেন্ডার সার্ভার) অফলোড করার অনুমতি দেয়। Apple সরাসরি CALayer-এর সাথে কাজ করার পরামর্শ দেয় যদি স্ক্রিনে ২০০টির বেশি ভিউ থাকে — এটি CPU লোড কমায়।
রেসপন্ডার চেইন সেই অবজেক্ট দিয়ে শুরু হয় যা প্রথমে একটি টাচ ইভেন্ট গ্রহণ করে। যদি এটি ইভেন্ট হ্যান্ডেল না করে (পদ্ধতি touchesBegan ওভাররাইড করা হয়নি), তাহলে ইভেন্টটি চেইনের পরবর্তী রেসপন্ডারে যায়: next, superview, next responder, UIViewController, UIWindow, UIApplication, App Delegate। এটি প্রতিটি ভিউতে হ্যান্ডেলার যোগ না করে দৃশ্য স্তরে বৈশ্বিক জেসচার এবং কীবোর্ড ইভেন্ট আটকানোর অনুমতি দেয়।
প্রতিটি UIViewController ইভেন্টের একটি কঠোরভাবে সংজ্ঞায়িত ক্রমের মধ্য দিয়ে যায়। জীবনচক্রে পর্যায়গুলি অন্তর্ভুক্ত: আরম্ভ, ভিউ লোডিং, স্ক্রিনে উপস্থিত হওয়া, রোটেশনে লেআউট আপডেট, লুকানো, স্ক্রিন ছেড়ে যাওয়া এবং মেমরি মুক্ত করা। ডেভেলপার প্রতিটি পর্যায়ে কাস্টম কোড সম্পাদনের জন্য সংশ্লিষ্ট পদ্ধতি ওভাররাইড করে।
class ProfileViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
loadUserProfile()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
clearCache()
}
}
viewDidLoad-এ ইন্টারফেস কনফিগার করা হয় — সাবভিউ তৈরি করা হয়, কনস্ট্রেইন্ট সেট করা হয়, ডেলিগেট সাবস্ক্রাইব করা হয়। viewWillAppear-এ প্রদর্শনের আগে অপারেশন করা হয়: নেটওয়ার্ক থেকে তাজা ডেটা লোড করা, মান আপডেট করা। viewDidDisappear হলো বিজ্ঞপ্তি থেকে আনসাবস্ক্রাইব এবং অস্থায়ী ডেটা পরিষ্কার করার জায়গা। সমস্ত ওভাররাইডে super কল করা বাধ্যতামূলক, অন্যথায় ইভেন্ট চেইন ভেঙে যায়।
পুরানো iOS সংস্করণে viewDidUnload পদ্ধতি বিদ্যমান ছিল, যা মেমরি কম হলে কল করা হত। iOS 6 থেকে পদ্ধতিটি সরানো হয়েছে — এখন UIKit স্বয়ংক্রিয়ভাবে কন্ট্রোলারের ভিউ আনলোড করে যখন তারা দৃশ্যমান না থাকে। ডেভেলপারকে শুধুমাত্র ভিউ রেফারেন্স weak হিসাবে ঘোষণা করতে হবে যাতে ARC সিস্টেম সতর্কতা পেলে সঠিকভাবে মেমরি মুক্ত করতে পারে।
UIKit দুই ধরনের স্থানান্তর সমর্থন করে: segue (Storyboard-এর মাধ্যমে) এবং UINavigationController-এর মাধ্যমে প্রোগ্রামেটিক নেভিগেশন। একটি প্রোগ্রামেটিক স্থানান্তর দেখতে এরকম: navigationController?.pushViewController(detailVC, animated: true)। এই ক্ষেত্রে, detailVC-এর জীবনচক্র স্বাভাবিকভাবে এগিয়ে যায় — viewDidLoad একবার কল হয়, viewWillAppear প্রতিবার প্রদর্শিত হলে কল হয়।
Auto Layout হলো একটি অবস্থান নির্ধারণ পদ্ধতি যা গাণিতিক সম্পর্কের (কনস্ট্রেইন্ট) উপর ভিত্তি করে। হার্ড-কোডেড X এবং Y স্থানাঙ্কের পরিবর্তে, ডেভেলপার নিয়ম বর্ণনা করে: “বাটনটি লেবেলের ডানদিকে 16pt ব্যবধানে রয়েছে” বা “ভিউটি বাম এবং ডানে 20pt মার্জিন সহ স্ক্রিনের প্রস্থ জুড়ে বিস্তৃত হয়।” সিস্টেম রানটাইমে ফলস্বরূপ সমীকরণ সিস্টেম সমাধান করে, ইন্টারফেসকে যেকোনো স্ক্রিন সাইজে অভিযোজিত করে।
কনস্ট্রেইন্ট Interface Builder-এ (ড্র্যাগ-এন্ড-ড্রপের মাধ্যমে) বা Swift-এ প্রোগ্রামেটিকভাবে সেট করা যেতে পারে। প্রতিটি কনস্ট্রেইন্ট NSLayoutConstraint ক্লাসের একটি ইনস্ট্যান্স যার প্যারামিটার রয়েছে: firstItem, firstAttribute, relation, secondItem, secondAttribute, multiplier, constant। কনস্ট্রেইন্ট isActive = true-এর মাধ্যমে বা ব্যাচে NSLayoutConstraint.activate()-এর মাধ্যমে সক্রিয় করা হয়।
iPhone X (2017) প্রবর্তনের সাথে, Apple Safe Area চালু করেছে — স্ক্রিনের এলাকা যা নচ, গোলাকার কোণ এবং হোম বার ইন্ডিকেটর থেকে মুক্ত। কনস্ট্রেইন্ট view.safeAreaLayoutGuide-এর সাথে সংযুক্ত করা উচিত, view-এর সাথে নয়। Layout Margins ভিউতে অভ্যন্তরীণ প্যাডিং যোগ করে, ডিফল্টরূপে প্রসঙ্গের উপর নির্ভর করে 8pt বা 16pt। safeAreaLayoutGuide ব্যবহার করা iPhone এবং iPad-এর সমস্ত প্রজন্মে সঠিক প্রদর্শন নিশ্চিত করে।
Auto Layout কনস্ট্রেইন্ট ধ্রুবক পরিবর্তন করে অ্যানিমেশন সমর্থন করে। শুধু কনস্ট্রেইন্টের constant আপডেট করুন এবং অ্যানিমেশন ব্লকের ভিতরে layoutIfNeeded সহ UIView.animate কল করুন। সিস্টেম পিরামিডের সমস্ত ভিউয়ের অবস্থান মসৃণভাবে পুনঃগণনা করে। এই কৌশলটি প্রসারণযোগ্য ব্লক, অভিযোজিত কীবোর্ড প্যানেল এবং স্ক্রিন ওরিয়েন্টেশন পরিবর্তনের জন্য ব্যবহৃত হয়।
UITableView এবং UICollectionView তালিকা এবং গ্রিড প্রদর্শনের জন্য UIKit-এর দুটি শক্তিশালী টুল। UITableView একক-কলাম উল্লম্ব তালিকার (চ্যাট, সেটিংস, নিউজ ফিড) জন্য উপযুক্ত। UICollectionView গ্রিড, অনুভূমিক তালিকা, ক্যারোসেল এবং কাস্টম লেআউট (গ্যালারি, পণ্য, ক্যালেন্ডার) এর জন্য। উভয় ক্লাস ডেটা এবং তার চেহারা আলাদা করতে ডেলিগেশন প্যাটার্ন ব্যবহার করে।
ডেটা উৎস হলো UITableViewDataSource প্রোটোকল যার বাধ্যতামূলক পদ্ধতি numberOfRowsInSection এবং cellForRowAt। UITableViewDelegate সেল ট্যাপ, সারির উচ্চতা এবং স্ক্রল ইভেন্ট হ্যান্ডেল করে। রিইউজ আইডেন্টিফায়ার প্রক্রিয়া স্ক্রিনের বাইরে চলে যাওয়া সেল পুনরায় ব্যবহার করে, যা বড় তালিকায় কর্মক্ষমতার জন্য গুরুত্বপূর্ণ।
class ContactsViewController: UITableViewController {
private let contacts = ["আনা", "বরিস", "ভিক্টর"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self,
forCellReuseIdentifier: "cell")
}
override func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return contacts.count
}
override func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell",
for: indexPath)
var content = cell.defaultContentConfiguration()
content.text = contacts[indexPath.row]
cell.contentConfiguration = content
return cell
}
}
উদাহরণটি স্ট্রিংয়ের একটি অ্যারে প্রদর্শনের জন্য একটি ন্যূনতম কন্ট্রোলার দেখায়। সেলটি UIListContentConfiguration-এর মাধ্যমে কনফিগার করা হয় — একটি আধুনিক API (iOS 14+) যা পুরানো textLabel এবং detailTextLabel প্রতিস্থাপন করেছে। viewDidLoad-এ সেল ক্লাস নিবন্ধন করা বাধ্যতামূলক, অন্যথায় অ্যাপ্লিকেশন রানটাইম ব্যতিক্রম সহ ক্র্যাশ হবে।
iOS 13 থেকে শুরু করে, Apple জটিল লেআউট তৈরির জন্য UICollectionViewCompositionalLayout সুপারিশ করে। ডেভেলপার সেকশন, গ্রুপ, আইটেম এবং তাদের আকার ঘোষণামূলকভাবে বর্ণনা করে — ফলে নির্বিচারে জ্যামিতি সহ একটি গ্রিড পাওয়া যায়: স্ট্রিপ, 2x2 গ্রিড, ক্যারোসেল বা অলঙ্কার। Compositional Layout সমস্ত নতুন প্রকল্পের জন্য পুরানো UICollectionViewFlowLayout প্রতিস্থাপন করেছে। DiffableDataSource-এর সাথে মিলিত হলে, কালেকশন আপডেট করা একটি একক apply(snapshot) কল এ সীমাবদ্ধ হয় এবং পরিবর্তন অ্যানিমেশন স্বয়ংক্রিয়ভাবে সঞ্চালিত হয়।
নীচে বাস্তব কাজে UIKit ব্যবহারের দুটি ব্যবহারিক উদাহরণ দেওয়া হয়েছে: শ্যাডো এবং গোলাকার কোণ সহ কাস্টম ভিউ তৈরি করা এবং তালিকা থেকে আইটেম মুছতে সোয়াইপ জেসচার হ্যান্ডেল করা।
extension UIView {
func applyCardStyle() {
layer.cornerRadius = 12
layer.shadowOpacity = 0.15
layer.shadowRadius = 8
layer.shadowOffset = CGSize(width: 0, height: 2)
layer.masksToBounds = false
}
}
@objc private func handleSwipe(_ gesture: UISwipeGestureRecognizer) {
guard let swipedView = gesture.view else { return }
UIView.animate(withDuration: 0.3) {
swipedView.alpha = 0
swipedView.transform = CGAffineTransform(translationX: 300, y: 0)
} completion: { _ in
swipedView.removeFromSuperview()
}
}
applyCardStyle এক্সটেনশন যেকোনো ভিউতে শ্যাডো এবং গোলাকার কোণ যোগ করে — পণ্য কার্ড, প্রোফাইল এবং বিজ্ঞপ্তির জন্য দরকারী। অ্যানিমেশন সহ handleSwipe পদ্ধতি একটি আইটেম মুছে ফেলে যখন ব্যবহারকারী এটিতে ডানদিকে সোয়াইপ করে। হ্যান্ডেলারটি addGestureRecognizer-এর মাধ্যমে UISwipeGestureRecognizer(direction: .right) কনফিগারেশন সহ ভিউতে যোগ করা হয়। masksToBounds = false সেট করা গুরুত্বপূর্ণ যাতে শ্যাডো ভিউ সীমানা দ্বারা ক্লিপ না হয়।
আরো জটিল ইন্টারফেসের জন্য UIStackView ব্যবহার করুন — একটি কন্টেইনার যা নেস্টেড ভিউ স্বয়ংক্রিয়ভাবে অনুভূমিক বা উল্লম্বভাবে বিতরণ করে। Stack View লেআউট সরল করে: প্রতিটি উপাদানের জন্য কনস্ট্রেইন্ট সেট করার প্রয়োজন নেই, স্ট্যাকের জন্য শুধু একটি কনস্ট্রেইন্ট যথেষ্ট।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
Frame হলো superview-এর স্থানাঙ্কে একটি আয়তক্ষেত্র (অবস্থান + আকার)। Bounds হলো ভিউয়ের নিজস্ব স্থানাঙ্কে একটি আয়তক্ষেত্র (সর্বদা 0,0 থেকে শুরু হয়)। Frame rotate এবং scale এ পরিবর্তিত হয়; bounds পরিবর্তিত হয় না।
UIKit স্বয়ংক্রিয়ভাবে লুকানো কন্ট্রোলারের ভিউ আনলোড করে। ডেভেলপারকে শুধুমাত্র ভিউ বৈশিষ্ট্য weak var হিসাবে ঘোষণা করতে হবে যাতে ARC সিস্টেম সতর্কতা পেলে মেমরি মুক্ত করতে পারে।
নতুন প্রকল্পের জন্য, Apple SwiftUI সুপারিশ করে। যদি প্রকল্প UIKit ব্যবহার করে — পৃথক স্ক্রিনের জন্য XIB বা SnapKit-এর মাধ্যমে প্রোগ্রামেটিক লেআউট ব্যবহার করুন। Storyboard মার্জ কনফ্লিক্ট তৈরি করে এবং বিল্ড ধীর করে।
traitCollection সমর্থন সহ UIColor ব্যবহার করুন: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }। UIUserInterfaceStyle কী দিয়ে Info.plist-এ ডার্ক মোড সক্রিয় করুন।
UIStackView alignment, distribution এবং spacing-এর উপর ভিত্তি করে নেস্টেড ভিউয়ের অবস্থান এবং আকার স্বয়ংক্রিয়ভাবে গণনা করে। এটি কনস্ট্রেইন্ট কোড ৬০u২০১৩৮০% কমিয়ে দেয় এবং বিভিন্ন স্ক্রিনে খাপ খাওয়ানো সহজ করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন