कस्टम यूविवि उपवर्ग उदाहरण
मैं आमतौर पर स्टोरीबोर्ड या नीब का उपयोग किए बिना आईओएस ऐप बनाता हूं। मैं आपके प्रश्नों का उत्तर देने के लिए सीखी गई कुछ तकनीकों को साझा करूँगा।
अवांछित init
तरीके छिपाना
मेरा पहला सुझाव UIView
अवांछित आरंभकर्ताओं को छिपाने के लिए एक आधार घोषित करना है। मैंने "यूबी सबक्लासेस में स्टोरीबोर्ड और निब स्पेसिफिक इनिशियलाइज़र्स को कैसे छिपाएँ" के उत्तर में इस दृष्टिकोण पर विस्तार से चर्चा की है । नोट: यह दृष्टिकोण मानता है कि आप BaseView
स्टोरीबोर्ड या निब में इसके वंशजों का उपयोग नहीं करेंगे या नहीं करेंगे क्योंकि यह जानबूझकर ऐप को क्रैश करने का कारण बनेगा।
class BaseView: UIView {
// This initializer hides init(frame:) from subclasses
init() {
super.init(frame: CGRect.zero)
}
// This attribute hides `init(coder:)` from subclasses
@available(*, unavailable)
required init?(coder aDecoder: NSCoder) {
fatalError("NSCoding not supported")
}
}
आपके कस्टम UIView उपवर्ग को इनहेरिट करना चाहिए BaseView
। इसे अपने इनिशियलाइज़र में super.init () कहना होगा। इसे लागू करने की जरूरत नहीं है init(coder:)
। यह नीचे दिए गए उदाहरण में प्रदर्शित किया गया है।
एक UITextField जोड़ना
मैं init
विधि के बाहर संदर्भित साक्षात्कार के लिए संग्रहीत गुण बनाता हूं । मैं आमतौर पर एक UITextField के लिए ऐसा करता हूं। मैं इस तरह उप-संपत्ति की घोषणा के भीतर साक्षात्कार को तुरंत पसंद करना चाहता हूं let textField = UITextField()
:।
UITextField तब तक दिखाई नहीं देगा जब तक आप उसे कॉल करके कस्टम दृश्य की सबव्यू सूची में नहीं जोड़ते addSubview(_:)
। यह नीचे दिए गए उदाहरण में प्रदर्शित किया गया है।
ऑटो लेआउट के बिना प्रोग्रामेटिक लेआउट
UITextField तब तक दिखाई नहीं देगा जब तक आप उसका आकार और स्थिति निर्धारित नहीं करते। मैं अक्सर लेआउट में कोड (ऑटो लेआउट का उपयोग नहीं) लेआउट लेआउट साक्षात्कार विधि के भीतर करता हूं । layoutSubviews()
शुरू में कहा जाता है और जब भी कोई आकार परिवर्तन घटना होती है। यह CustomView के आकार के आधार पर लेआउट को समायोजित करने की अनुमति देता है। उदाहरण के लिए, अगर CustomView iPhones और iPads के विभिन्न आकारों पर पूरी चौड़ाई दिखाई देता है और रोटेशन के लिए समायोजित होता है, तो इसे कई प्रारंभिक आकारों को समायोजित करने और गतिशील रूप से आकार बदलने की आवश्यकता होती है।
आप संदर्भ के लिए CustomView के आयाम प्राप्त करने के लिए frame.height
और frame.width
भीतर संदर्भित कर सकते हैं layoutSubviews()
। यह नीचे दिए गए उदाहरण में प्रदर्शित किया गया है।
उदाहरण UIView उपवर्ग
एक कस्टम UIView उपवर्ग जिसमें एक UITextField होता है जिसे लागू करने की आवश्यकता नहीं होती है init?(coder:)
।
class CustomView: BaseView {
let textField = UITextField()
override init() {
super.init()
// configure and add textField as subview
textField.placeholder = "placeholder text"
textField.font = UIFont.systemFont(ofSize: 12)
addSubview(textField)
}
override func layoutSubviews() {
super.layoutSubviews()
// Set textField size and position
textField.frame.size = CGSize(width: frame.width - 20, height: 30)
textField.frame.origin = CGPoint(x: 10, y: 10)
}
}
ऑटो लेआउट के साथ प्रोग्रामेटिक लेआउट
आप कोड में ऑटो लेआउट का उपयोग करके लेआउट को भी लागू कर सकते हैं। चूंकि मैं अक्सर ऐसा नहीं करता हूं, मैं एक उदाहरण नहीं दिखाऊंगा। आप इंटरनेट पर स्टैक ओवरफ्लो और अन्य जगहों पर कोड में ऑटो लेआउट को लागू करने के उदाहरण पा सकते हैं।
प्रोग्रामेटिक लेआउट फ्रेमवर्क
खुले स्रोत ढांचे हैं जो कोड में लेआउट को लागू करते हैं। एक मैं जिसमें दिलचस्पी है लेकिन कोशिश नहीं की है LayoutKit । इसे डेवलपमेंट टीम लिंक्डइन ने लिखा था। जीथब रिपॉजिटरी से: "लिंक्डइन ने लेआउटकिट बनाया क्योंकि हमने पाया है कि स्क्रॉल लेआउट में जटिल दृश्य पदानुक्रमों के लिए ऑटो लेआउट पर्याप्त प्रदर्शन नहीं कर रहा है।"
क्यों डाल fatalError
मेंinit(coder:)
UIView उपवर्गों का निर्माण करते समय जिनका उपयोग स्टोरीबोर्ड या नीब में कभी नहीं किया जाएगा, आप अलग-अलग मापदंडों और आरंभीकरण आवश्यकताओं के साथ इनिशियलाइज़र को पेश कर सकते हैं जिन्हें init(coder:)
विधि द्वारा नहीं बुलाया जा सकता है । यदि आप init (कोडर :) के साथ विफल नहीं हुए 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() {
// Your custom initialization code
}
}