मैं नामित और आवश्यक के लिए एक सामान्य init बनाता हूं। सुविधा के लिए, मैं init(frame:)शून्य के फ्रेम के साथ प्रतिनिधि हूं ।
शून्य फ्रेम होने में कोई समस्या नहीं है क्योंकि आम तौर पर दृश्य ViewController के दृश्य के अंदर होता है; जब आपके पर्यवेक्षी कॉल करते हैं तो आपके कस्टम दृश्य को इसके सब-वेवेज़ को लेआउट करने का एक अच्छा, सुरक्षित मौका मिलेगाlayoutSubviews() याupdateConstraints() । इन दोनों कार्यों को सिस्टम द्वारा पुनरावर्ती रूप से पूरे पदानुक्रम में कहा जाता है। आप updateContstraints()या तो उपयोग कर सकते हैं या layoutSubviews()। updateContstraints()पहले कहा जाता है, फिर layoutSubviews()। में updateConstraints()मेकअप यकीन है कि सुपर कॉल करने के लिए पिछले । में layoutSubviews(), पहले सुपर बुलाओ ।
यहाँ मैं क्या कर रहा हूँ:
@IBDesignable
class MyView: UIView {
convenience init(args: Whatever) {
self.init(frame: CGRect.zero)
//assign custom vars
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
commonInit()
}
private func commonInit() {
//custom initialization
}
override func updateConstraints() {
//set subview constraints here
super.updateConstraints()
}
override func layoutSubviews() {
super.layoutSubviews()
//manually set subview frames here
}
}
var। लेकिन स्विफ्ट में डिफ़ॉल्ट सबसे अच्छा अभ्यास चर घोषित करना हैletजब तक कि उन्हें घोषित करने का कोई कारण नहीं हैvar। ऊपर मेरे कोड उदाहरण में ऐसा करने का कोई कारण नहीं था, इसलिएlet।