কাস্টম ইউআইভিউ সাবক্লাস উদাহরণ
আমি সাধারণত স্টোরিবোর্ড বা নিব ব্যবহার না করে আইওএস অ্যাপস তৈরি করি। আমি আপনার প্রশ্নের উত্তর দিতে শিখেছি এমন কিছু কৌশলগুলি ভাগ করব।
অযাচিত initপদ্ধতি লুকানো হচ্ছে
আমার প্রথম পরামর্শটি UIViewঅবাঞ্ছিত প্রারম্ভিকদের আড়াল করার জন্য একটি বেস ঘোষণা করা। "এই স্টোরিবোর্ড এবং ইউআই সাবক্ল্যাসে নিব স্পেশালিফিক ইনিশিয়ালাইজারগুলি কীভাবে লুকিয়ে রাখবেন" এই উত্তরটিতে আমি এই পদ্ধতির বিষয়ে বিস্তারিত আলোচনা করেছি । দ্রষ্টব্য: এই পদ্ধতিটি ধরে নিয়েছে যে আপনি BaseViewবা তার বংশধরদের স্টোরিবোর্ড বা নিবগুলিতে ব্যবহার করবেন না কারণ এটি ইচ্ছাকৃতভাবে অ্যাপটিকে ক্র্যাশ করবে।
class BaseView: UIView {
init() {
super.init(frame: CGRect.zero)
}
@available(*, unavailable)
required init?(coder aDecoder: NSCoder) {
fatalError("NSCoding not supported")
}
}
আপনার কাস্টম ইউআইভিউ সাবক্লাসটি উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া উচিত BaseView। এটি অবশ্যই তার ইনিশিয়ালাইজারে সুপার.init () কল করবে call এটি বাস্তবায়নের দরকার নেই init(coder:)। এটি নীচের উদাহরণে প্রদর্শিত হয়।
একটি ইউআইটিেক্সটফিল্ড যুক্ত করা হচ্ছে
আমি initপদ্ধতির বাইরে রেফারেন্স করা সাবভিউগুলির জন্য সঞ্চিত বৈশিষ্ট্য তৈরি করি । আমি সাধারণত একটি ইউআইটিেক্সটফিল্ডের জন্য এটি করব। আমি ভালো subview সম্পত্তি ঘোষণা মধ্যে instantiate subviews পছন্দ: let textField = UITextField()।
আপনি কল করে কাস্টম ভিউ'র সাবভিউ তালিকায় যুক্ত না করলেই ইউআইটিেক্সটফিল্ডটি দৃশ্যমান হবে না addSubview(_:)। এটি নীচের উদাহরণে প্রদর্শিত হয়।
অটো লেআউট ছাড়াই প্রোগ্রাম্যাটিক লেআউট
আপনি যদি এর আকার এবং অবস্থান নির্ধারণ না করেন তবে ইউআইটিেক্সটফিল্ডটি দৃশ্যমান হবে না। আমি প্রায়শই লেআউটসুউভিউস পদ্ধতিতে কোডে লেআউট (অটো লেআউট ব্যবহার না করে) করি । layoutSubviews()প্রাথমিকভাবে বলা হয় এবং যখনই পুনরায় আকার দেওয়ার ঘটনা ঘটে। এটি কাস্টমভিউয়ের আকারের উপর নির্ভর করে বিন্যাস সামঞ্জস্য করতে দেয়। উদাহরণস্বরূপ, কাস্টমভিউ যদি আইফোন এবং আইপ্যাডের বিভিন্ন আকারের এবং পুরো ঘূর্ণনের জন্য অ্যাডজাস্টের পুরো প্রস্থে উপস্থিত হয়, তবে এটির অনেকগুলি প্রাথমিক মাপের সমন্বয় এবং গতিশীল আকার পরিবর্তন করতে হবে।
রেফারেন্সের জন্য কাস্টমভিউয়ের মাত্রাগুলি পেতে আপনি frame.heightএবং এর frame.widthমধ্যে উল্লেখ করতে পারেন layoutSubviews()। এটি নীচের উদাহরণে প্রদর্শিত হয়।
উদাহরণস্বরূপ ইউআইভিউ সাবক্লাস
একটি কাস্টম ইউআইভিউ সাবক্লাসে একটি ইউআইটিেক্সটফিল্ড রয়েছে যা বাস্তবায়নের প্রয়োজন হয় না init?(coder:)।
class CustomView: BaseView {
let textField = UITextField()
override init() {
super.init()
textField.placeholder = "placeholder text"
textField.font = UIFont.systemFont(ofSize: 12)
addSubview(textField)
}
override func layoutSubviews() {
super.layoutSubviews()
textField.frame.size = CGSize(width: frame.width - 20, height: 30)
textField.frame.origin = CGPoint(x: 10, y: 10)
}
}
অটো লেআউট সহ প্রোগ্রামেটিক লেআউট
আপনি কোডে অটো লেআউট ব্যবহার করে বিন্যাসটিও প্রয়োগ করতে পারেন। যেহেতু আমি প্রায়শই এটি করি না, তাই আমি উদাহরণ দেখাব না। স্ট্যাক ওভারফ্লোতে এবং অন্য কোথাও কোডে অটো লেআউট কার্যকর করার উদাহরণগুলি আপনি খুঁজে পেতে পারেন।
প্রোগ্রামেটিক লেআউট ফ্রেমওয়ার্ক
কোডে লেআউট কার্যকর করে এমন ওপেন সোর্স ফ্রেমওয়ার্ক রয়েছে। আমি আগ্রহী কিন্তু একটি চেষ্টা করি নি সে হ'ল লেআউটকিট । এটি ডেভলপমেন্ট টিম একটি লিঙ্কডইন লিখেছিল। গিথুব সংগ্রহশালা থেকে: "লিঙ্কডইন লেআউটকিট তৈরি করেছে কারণ আমরা দেখতে পেয়েছি যে স্ক্রোলযোগ্য ভিউগুলিতে জটিল ভিউয়ের স্তরক্রমের জন্য অটো লেআউট যথেষ্ট পারফর্মেন্ট নয়" "
কেন করা fatalErrorমধ্যেinit(coder:)
ইউআইভিউউ সাবক্ল্যাসগুলি তৈরি করার সময় যা স্টোরিবোর্ড বা নিব কখনই ব্যবহৃত হবে না, আপনি হয়ত বিভিন্ন পরামিতি এবং প্রারম্ভিককরণের প্রয়োজনীয়তাগুলির সাথে প্রবর্তনকারীদের পরিচয় করিয়ে দিতে পারেন যা init(coder:)পদ্ধতি দ্বারা কল করা যায় না । আপনি যদি থ্রিজি (কোডার :) এর সাথে ব্যর্থ না হন fatalError, দুর্ঘটনাক্রমে স্টোরিবোর্ড / নিব ব্যবহার করা গেলে এটি লাইনে খুব বিভ্রান্তিকর সমস্যা দেখা দিতে পারে। মারাত্মক ইরর এই উদ্দেশ্যগুলি জোর করে।
required init?(coder aDecoder: NSCoder) {
fatalError("NSCoding not supported")
}
সাবক্লাসটি কোড বা স্টোরিবোর্ড / নিব তৈরি না করেই যদি আপনি কিছু কোড চালনা করতে চান তবে নীচের মতো আপনি কিছু করতে পারেন ( জেফ গু কাংয়ের উত্তরের ভিত্তিতে )
class CustomView: UIView {
override init (frame: CGRect) {
super.init(frame: frame)
initCommon()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initCommon()
}
func initCommon() {
}
}