स्विफ्ट 5 के लिए अपडेट किया गया
preferredLayoutAttributesFittingAttributespreferredLayoutAttributesFittingऑटो साइज़िंग का नाम और उपयोग
स्विफ्ट 4 के लिए अपडेट किया गया
systemLayoutSizeFittingSize का नाम बदल दिया systemLayoutSizeFitting
IOS 9 के लिए अपडेट किया गया
IOS 9 के तहत मेरे GitHub समाधान को देखने के बाद मुझे आखिरकार इस मुद्दे की पूरी तरह से जांच करने का समय मिला। मैंने अब स्व-आकार देने वाली कोशिकाओं के लिए विभिन्न कॉन्फ़िगरेशन के कई उदाहरणों को शामिल करने के लिए रेपो को अपडेट किया है। मेरा निष्कर्ष यह है कि स्व-आकार देने वाले सेल सिद्धांत में महान हैं लेकिन व्यवहार में गड़बड़ हैं। स्व-आकार देने वाली कोशिकाओं के साथ आगे बढ़ने पर सावधानी का एक शब्द।
टी एल; डॉ
मेरे GitHub प्रोजेक्ट को देखें
सेल्फ साइजिंग सेल केवल फ्लो लेआउट के साथ समर्थित हैं, इसलिए सुनिश्चित करें कि आप क्या उपयोग कर रहे हैं।
काम करने के लिए स्व-आकार देने वाली कोशिकाओं के लिए सेटअप करने के लिए आपको दो चीजें चाहिए।
1. सेट estimatedItemSizeपरUICollectionViewFlowLayout
estimatedItemSizeप्रॉपर्टी सेट करते ही फ्लो लेआउट प्रकृति में गतिशील हो जाएगा ।
self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
2. अपने सेल उपवर्ग पर आकार देने के लिए समर्थन जोड़ें
यह 2 स्वादों में आता है; ऑटो-लेआउट या कस्टम ओवरराइड preferredLayoutAttributesFittingAttributes।
ऑटो लेआउट के साथ सेल बनाएं और कॉन्फ़िगर करें
मैं इसके बारे में विस्तार से नहीं बताऊंगा क्योंकि एक सेल के लिए बाधाओं को कॉन्फ़िगर करने के बारे में एक शानदार एसओ पोस्ट है । बस इस बात से सावधान रहें कि Xcode 6 ने iOS 7 के साथ सामान का एक गुच्छा तोड़ दिया है, इसलिए यदि आप iOS 7 का समर्थन करते हैं, तो आपको ऐसे सामान करने की आवश्यकता होगी जैसे यह सुनिश्चित करें कि ऑटोरेस्पोन्गिंग मास्क सेल के contentView पर सेट है और जब सामग्री की सीमा सेल की सीमा के रूप में सेट होती है। सेल लोड किया गया है (यानी awakeFromNib)।
जिन चीजों की आपको जानकारी होनी चाहिए, वह यह है कि आपके सेल को टेबल व्यू सेल की तुलना में अधिक गंभीरता से विवश होना चाहिए। उदाहरण के लिए, यदि आप चाहते हैं कि आपकी चौड़ाई गतिशील हो तो आपके सेल को ऊंचाई में अवरोध की आवश्यकता होती है। इसी तरह, यदि आप चाहते हैं कि ऊँचाई गतिशील हो तो आपको अपने सेल में एक चौड़ाई की कमी की आवश्यकता होगी।
preferredLayoutAttributesFittingAttributesअपने कस्टम सेल में लागू करें
जब यह फ़ंक्शन कहलाता है तो आपका दृश्य पहले से ही सामग्री के साथ कॉन्फ़िगर किया गया है (जैसे cellForItemकहा जाता है)। अपने अवरोधों को उचित रूप से निर्धारित करते हुए कि आप इस तरह एक कार्यान्वयन हो सकता है:
//forces the system to do one layout pass
var isHeightCalculated: Bool = false
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
//Exhibit A - We need to cache our calculation to prevent a crash.
if !isHeightCalculated {
setNeedsLayout()
layoutIfNeeded()
let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
var newFrame = layoutAttributes.frame
newFrame.size.width = CGFloat(ceilf(Float(size.width)))
layoutAttributes.frame = newFrame
isHeightCalculated = true
}
return layoutAttributes
}
नोट iOS 9 पर व्यवहार थोड़ा बदल गया है जो आपके कार्यान्वयन पर क्रैश का कारण बन सकता है यदि आप सावधान नहीं हैं ( यहाँ और देखें )। जब आप लागू preferredLayoutAttributesFittingAttributesकरते हैं तो आपको यह सुनिश्चित करने की आवश्यकता होती है कि आप केवल एक बार अपने लेआउट विशेषताओं के फ्रेम को बदल दें। यदि आप ऐसा नहीं करते हैं तो लेआउट अनिश्चित रूप से आपके कार्यान्वयन को कॉल करेगा और अंततः दुर्घटनाग्रस्त हो जाएगा। एक उपाय यह है कि आप अपने सेल में परिकलित आकार को कैश करें और इसे तब तक अमान्य कर दें जब तक आप सेल का पुनः उपयोग न करें या इसकी सामग्री को बदल दें जैसा कि मैंने इसके साथ किया हैisHeightCalculated संपत्ति के है।
अपने लेआउट का अनुभव करें
इस बिंदु पर आपको अपने संग्रह दृश्य में 'कार्यशील' डायनामिक सेल होना चाहिए। मुझे अभी तक मेरे परीक्षणों के दौरान आउट-ऑफ-द-बॉक्स समाधान पर्याप्त नहीं मिला है इसलिए यदि आपके पास है तो टिप्पणी करने के लिए स्वतंत्र महसूस करें। यह अभी भी महसूस करता है कि UITableViewगतिशील नौकरशाही का आकार घटाने के लिए लड़ाई जीतता है।
चेतावनियां
बहुत ध्यान रखें कि यदि आप अनुमान लगाने के लिए प्रोटोटाइप कोशिकाओं का उपयोग कर रहे हैं, तो यह अनुमान लगाता है कि यदि आपका XIB आकार की कक्षाओं का उपयोग करता है, तो यह टूट जाएगा । इसका कारण यह है कि जब आप अपने सेल को एक XIB से लोड करते हैं तो इसका आकार वर्ग के साथ कॉन्फ़िगर किया जाएगा Undefined। यह केवल iOS 8 और ऊपर से टूट जाएगा iOS 7 पर आकार वर्ग डिवाइस (iPad = Regular-Any, iPhone = Compact-Any) के आधार पर लोड किया जाएगा। आप XIB को लोड किए बिना अनुमानित या तो सेट कर सकते हैं, या आप XIB से सेल को लोड कर सकते हैं, इसे संग्रह दृश्य में जोड़ सकते हैं (यह traitCollection सेट कर देगा), लेआउट निष्पादित करें, और फिर इसे पर्यवेक्षण से हटा दें। वैकल्पिक रूप से आप अपने सेल को traitCollectionगेटटर को ओवरराइड कर सकते हैं और उचित लक्षण वापस कर सकते हैं। यह आप पर निर्भर करता है।
मुझे बताएं कि क्या मुझे कुछ याद आया है, आशा है कि मैंने मदद की और सौभाग्य कोडिंग