आप iOS8 के टेबलव्यू में एक शानदार नए फीचर के साइड इफेक्ट का सामना कर रहे हैं: ऑटोमैटिक रो हाइट्स।
IOS 7 में, आपके पास या तो एक निश्चित आकार की पंक्तियाँ थीं (सेट के साथ tableView.rowHeight
), या आप अपनी कोशिकाओं की ऊँचाई की गणना करने के लिए कोड लिखेंगे और आप इसमें वापस आ जाएंगे tableView:heightForRowAtIndexPath
। यदि आप अपने सेल में कई विचार रखते हैं और आपके पास अलग-अलग फ़ॉन्ट आकार पर विचार करने के लिए अलग-अलग ऊंचाइयां हैं, तो सेल की ऊंचाई की गणना के लिए कोड लिखना काफी जटिल हो सकता है। डायनामिक टाइप में जोड़ें और प्रक्रिया गधे में दर्द था।
IOS 8 में, आप अभी भी ऊपर कर सकते हैं, लेकिन अब पंक्तियों की ऊंचाई iOS द्वारा निर्धारित की जा सकती है, बशर्ते कि आपने ऑटो लेआउट का उपयोग करके अपने सेल की सामग्री को कॉन्फ़िगर किया हो। यह डेवलपर्स के लिए बहुत बड़ा लाभ है, क्योंकि जैसा कि डायनेमिक फ़ॉन्ट आकार बदलता है, या उपयोगकर्ता एक्सेसिबिलिटी सेटिंग्स का उपयोग करके टेक्स्ट आकार को संशोधित करता है, आपका यूआई नए आकार के अनुकूल हो सकता है। इसका मतलब यह भी है कि अगर आपके पास एक यूआईलैब है जिसमें पाठ की कई पंक्तियाँ हो सकती हैं, तो आपके सेल को उन कोशिकाओं को समायोजित करने के लिए बढ़ सकता है जब कोशिकाओं को इसकी आवश्यकता होती है, और जब यह नहीं होता है तो सिकुड़ जाता है, इसलिए कोई अनावश्यक व्हाट्सएप नहीं है।
आपको जो चेतावनी संदेश दिखाई दे रहा है, वह आपको बता रहा है कि सेल की ऊंचाई के सारणी के बारे में सूचित करने के लिए ऑटो लेआउट के लिए आपके सेल में पर्याप्त अवरोध नहीं हैं।
डायनामिक सेल ऊँचाई का उपयोग करने के लिए, जो अन्य पोस्टरों द्वारा पहले ही बताई गई तकनीकों के साथ, इस संदेश से भी छुटकारा दिलाएगा, आपको यह सुनिश्चित करने की आवश्यकता है कि सेल के ऊपर और नीचे UI आइटम को बाँधने के लिए आपके सेल के पास पर्याप्त अवरोध हैं । यदि आपने पहले ऑटो लेआउट का उपयोग किया है, तो आप शायद टॉप + लीडिंग बाधाओं को स्थापित करने के आदी हैं, लेकिन डायनेमिक रो ऊंचाई को भी नीचे की कमी की आवश्यकता होती है।
लेआउट पास इस तरह से काम करता है, जो स्क्रीन पर प्रदर्शित होने से ठीक पहले, समय-समय पर होता है:
आंतरिक आकारों के साथ सामग्री के लिए आयामों की गणना की जाती है। इसमें UILabels और UIImageView शामिल हैं, जहां उनके आयाम क्रमशः पाठ या UIImages पर आधारित होते हैं। ये दोनों दृश्य उनकी चौड़ाई को एक ज्ञात मानते हैं (क्योंकि आपने अनुगामी / अग्रणी किनारों के लिए बाधाओं को निर्धारित किया है, या आपने स्पष्ट चौड़ाई निर्धारित की है, या आपने क्षैतिज बाधाओं का उपयोग किया है जो अंततः एक तरफ से चौड़ाई को प्रकट करते हैं)। मान लीजिए कि एक लेबल में पाठ का एक पैराग्राफ है ("लाइनों की संख्या" 0 पर सेट है, तो यह ऑटो-रैप होगा), यह केवल 310 बिंदुओं के पार हो सकता है, इसलिए यह वर्तमान फ़ॉन्ट आकार में 120pt उच्च होना निर्धारित है।
यूआई को आपके स्थिति अवरोधों के अनुसार रखा गया है। लेबल के नीचे एक अवरोध होता है जो सेल के निचले मार्जिन से जुड़ता है। चूंकि लेबल 120 अंक लंबा हो गया है, और चूंकि यह बाधा द्वारा सेल के नीचे से बंधा हुआ है, इसलिए यह "नीचे के" कहे जाने वाले बाधा को संतुष्ट करने के लिए सेल को "नीचे" (सेल की ऊंचाई बढ़ाना) धक्का देना चाहिए। सेल के नीचे से लेबल हमेशा मानक दूरी पर होता है।
आपके द्वारा रिपोर्ट किया गया त्रुटि संदेश तब होता है जब वह निचला अवरोध गायब होता है, उस स्थिति में सेल के नीचे सेल के नीचे "पुश" करने के लिए कुछ भी नहीं होता है, जो कि अस्पष्टता है जो रिपोर्ट की गई है: नीचे से पुश करने के लिए कुछ भी नहीं के साथ शीर्ष, सेल ढह जाता है। लेकिन ऑटो लेआउट का पता लगाता है, भी, और मानक पंक्ति ऊंचाई का उपयोग करने के लिए वापस गिर जाता है।
इसके लायक होने के लिए, और ज्यादातर एक गोल जवाब देने के लिए, यदि आप iOS 8 के ऑटो लेआउट-आधारित डायनामिक पंक्ति हाइट्स को लागू करते हैं, तो आपको इसे लागू करना चाहिए tableView:estimatedHeightForRowAtIndexPath:
। वह अनुमान विधि आपके कक्षों के लिए किसी न किसी मान का उपयोग कर सकती है, और इसे तब कहा जाएगा जब तालिका दृश्य प्रारंभ में लोड हो जाएगा। यह UIKit को स्क्रॉलबार जैसी चीजों को आकर्षित करने में मदद करता है, जिसे तब तक नहीं खींचा जा सकता जब तक कि टेबलव्यू नहीं जानता कि यह कितनी सामग्री तक स्क्रॉल कर सकता है, लेकिन पूरी तरह से सटीक आकारों की आवश्यकता नहीं है, क्योंकि यह सिर्फ एक स्क्रॉलबार है। यह वास्तविक पंक्ति ऊंचाई की गणना को तब तक स्थगित रखने की अनुमति देता है जब तक कि सेल की आवश्यकता नहीं होती है, जो कम कम्प्यूटेशनल रूप से गहन है और आपके UITableView को जल्दी प्रस्तुत किया जा सकता है।