एक ऐसे मामले का पता लगाया जहां अड़चनें शून्य की ऊंचाई का अनुमान लगाती हैं


120

Xcode 6.1 बीटा 2 में अपडेट करने के बाद जब मैं अपना ऐप चलाता हूं जिसमें टेबलव्यू सेल होते हैं, तो डिबग असिस्टेंट कहता है:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

इससे पहले, जब मैं इस प्रोजेक्ट पर Xcode 5 का उपयोग करता था, तो मुझे कुछ त्रुटियां मिल जाती थीं, लेकिन जब मैंने अपग्रेड किया, तब तक वे चले गए। मेरे पास अब कोई अन्य त्रुटि या चेतावनी नहीं है। मैंने पहले ही सभी टेबलव्यू कोशिकाओं के आकार को समायोजित करने की कोशिश की है और मानक ऊंचाई का उपयोग करने की भी कोशिश की है, लेकिन मुझे अभी भी एक ही चेतावनी मिलती है:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

मैंने इस पर सभी समान विषयों के माध्यम से भी पढ़ा है लेकिन उनके समाधान में से कोई भी मदद नहीं करता है। जब मैं सिम्युलेटर के साथ ऐप का परीक्षण करता हूं, तो ऐप ठीक चलता है, उन तस्वीरों को छोड़कर जो टेबलव्यू कोशिकाओं में होनी चाहिए थीं।


2
मुझे संग्रह व्यू सेल के लिए समान त्रुटि मिल रही है। इसके लिए मैं क्या करता हूं। कोई सुझाव।
अजगर

शायद आपको जांचना चाहिए कि क्या आपने पहले ही xib फ़ाइल को लक्ष्य stackoverflow.com/a/26870331/1418457
onmyway133


मेरे साथ iOS 8.1 पर ऐसा हुआ, लेकिन अब iOS 8.4 पर नहीं है। यदि आपने ऊंचाई निर्दिष्ट की है, तो मुझे लगता है कि यह सिर्फ एक Xcode बग है।
samwize

जवाबों:


126

तीन चीजें इस चेतावनी को चुप कराने में कामयाब रही हैं। आप अपने लिए सबसे सुविधाजनक उठा सकते हैं। हालांकि सुंदर कुछ भी नहीं।

  • डिफॉल्ट सेल में डिफ़ॉल्ट सेल की ऊंचाई सेट करने के लिए

    self.tableView.rowHeight = 44;
  • स्टोरीबोर्ड पर जाएं और अपने टेबलव्यू पर पंक्ति की ऊंचाई को 44 से कुछ अलग करें।

  • टेबलव्यू के प्रतिनिधि विधि को लागू करने के लिए ऊँचाई फ़ोररॉएट इंडेक्सपेथ

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }

अजीब।


मैंने भी आपके तरीके का उपयोग करने की कोशिश की है, लेकिन मुझे rowHeight के लिए एक @property जोड़ने की आवश्यकता है लेकिन मुझे सही ऑब्जेक्ट प्रकार का उपयोग करने की जानकारी नहीं है
David E

हो सकता है कि मुझे आपका नोट न मिले लेकिन rowHeight UITableView की एक संपत्ति है। बस अपनी तालिका को किसी आउटलेट से कनेक्ट करें और बस।
विक्टर कुचेरा

4
ऐसा इसलिए है क्योंकि यदि आप आईबी में 44 वाँ मूल्य रखते हैं, तो यह विचार करेगा कि आप स्व-आकार देने वाली कोशिकाओं का उपयोग करना चाहते हैं। stackoverflow.com/questions/25888126/… (लेकिन, हाँ, यह वास्तव में एक अजीब व्यवहार है)
Guillaume Algis

तो जाहिर तौर पर मेरे पास दो व्यूडालॉड विधियां थीं और मैंने इसे self.tableView.rowHeight = 44;गलत में डाल दिया । त्रुटि दूर हो गई! धन्यवाद
डेविड ई

इसे और अधिक स्पष्ट करने के लिए धन्यवाद गिलियूम एल्जीस। यह अभी भी बहुत डरावना है।
विक्टर कुचेरा

216

आप iOS8 के टेबलव्यू में एक शानदार नए फीचर के साइड इफेक्ट का सामना कर रहे हैं: ऑटोमैटिक रो हाइट्स।

IOS 7 में, आपके पास या तो एक निश्चित आकार की पंक्तियाँ थीं (सेट के साथ tableView.rowHeight), या आप अपनी कोशिकाओं की ऊँचाई की गणना करने के लिए कोड लिखेंगे और आप इसमें वापस आ जाएंगे tableView:heightForRowAtIndexPath। यदि आप अपने सेल में कई विचार रखते हैं और आपके पास अलग-अलग फ़ॉन्ट आकार पर विचार करने के लिए अलग-अलग ऊंचाइयां हैं, तो सेल की ऊंचाई की गणना के लिए कोड लिखना काफी जटिल हो सकता है। डायनामिक टाइप में जोड़ें और प्रक्रिया गधे में दर्द था।

IOS 8 में, आप अभी भी ऊपर कर सकते हैं, लेकिन अब पंक्तियों की ऊंचाई iOS द्वारा निर्धारित की जा सकती है, बशर्ते कि आपने ऑटो लेआउट का उपयोग करके अपने सेल की सामग्री को कॉन्फ़िगर किया हो। यह डेवलपर्स के लिए बहुत बड़ा लाभ है, क्योंकि जैसा कि डायनेमिक फ़ॉन्ट आकार बदलता है, या उपयोगकर्ता एक्सेसिबिलिटी सेटिंग्स का उपयोग करके टेक्स्ट आकार को संशोधित करता है, आपका यूआई नए आकार के अनुकूल हो सकता है। इसका मतलब यह भी है कि अगर आपके पास एक यूआईलैब है जिसमें पाठ की कई पंक्तियाँ हो सकती हैं, तो आपके सेल को उन कोशिकाओं को समायोजित करने के लिए बढ़ सकता है जब कोशिकाओं को इसकी आवश्यकता होती है, और जब यह नहीं होता है तो सिकुड़ जाता है, इसलिए कोई अनावश्यक व्हाट्सएप नहीं है।

आपको जो चेतावनी संदेश दिखाई दे रहा है, वह आपको बता रहा है कि सेल की ऊंचाई के सारणी के बारे में सूचित करने के लिए ऑटो लेआउट के लिए आपके सेल में पर्याप्त अवरोध नहीं हैं।

डायनामिक सेल ऊँचाई का उपयोग करने के लिए, जो अन्य पोस्टरों द्वारा पहले ही बताई गई तकनीकों के साथ, इस संदेश से भी छुटकारा दिलाएगा, आपको यह सुनिश्चित करने की आवश्यकता है कि सेल के ऊपर और नीचे UI आइटम को बाँधने के लिए आपके सेल के पास पर्याप्त अवरोध हैं । यदि आपने पहले ऑटो लेआउट का उपयोग किया है, तो आप शायद टॉप + लीडिंग बाधाओं को स्थापित करने के आदी हैं, लेकिन डायनेमिक रो ऊंचाई को भी नीचे की कमी की आवश्यकता होती है।

लेआउट पास इस तरह से काम करता है, जो स्क्रीन पर प्रदर्शित होने से ठीक पहले, समय-समय पर होता है:

  1. आंतरिक आकारों के साथ सामग्री के लिए आयामों की गणना की जाती है। इसमें UILabels और UIImageView शामिल हैं, जहां उनके आयाम क्रमशः पाठ या UIImages पर आधारित होते हैं। ये दोनों दृश्य उनकी चौड़ाई को एक ज्ञात मानते हैं (क्योंकि आपने अनुगामी / अग्रणी किनारों के लिए बाधाओं को निर्धारित किया है, या आपने स्पष्ट चौड़ाई निर्धारित की है, या आपने क्षैतिज बाधाओं का उपयोग किया है जो अंततः एक तरफ से चौड़ाई को प्रकट करते हैं)। मान लीजिए कि एक लेबल में पाठ का एक पैराग्राफ है ("लाइनों की संख्या" 0 पर सेट है, तो यह ऑटो-रैप होगा), यह केवल 310 बिंदुओं के पार हो सकता है, इसलिए यह वर्तमान फ़ॉन्ट आकार में 120pt उच्च होना निर्धारित है।

  2. यूआई को आपके स्थिति अवरोधों के अनुसार रखा गया है। लेबल के नीचे एक अवरोध होता है जो सेल के निचले मार्जिन से जुड़ता है। चूंकि लेबल 120 अंक लंबा हो गया है, और चूंकि यह बाधा द्वारा सेल के नीचे से बंधा हुआ है, इसलिए यह "नीचे के" कहे जाने वाले बाधा को संतुष्ट करने के लिए सेल को "नीचे" (सेल की ऊंचाई बढ़ाना) धक्का देना चाहिए। सेल के नीचे से लेबल हमेशा मानक दूरी पर होता है।

आपके द्वारा रिपोर्ट किया गया त्रुटि संदेश तब होता है जब वह निचला अवरोध गायब होता है, उस स्थिति में सेल के नीचे सेल के नीचे "पुश" करने के लिए कुछ भी नहीं होता है, जो कि अस्पष्टता है जो रिपोर्ट की गई है: नीचे से पुश करने के लिए कुछ भी नहीं के साथ शीर्ष, सेल ढह जाता है। लेकिन ऑटो लेआउट का पता लगाता है, भी, और मानक पंक्ति ऊंचाई का उपयोग करने के लिए वापस गिर जाता है।

इसके लायक होने के लिए, और ज्यादातर एक गोल जवाब देने के लिए, यदि आप iOS 8 के ऑटो लेआउट-आधारित डायनामिक पंक्ति हाइट्स को लागू करते हैं, तो आपको इसे लागू करना चाहिए tableView:estimatedHeightForRowAtIndexPath:। वह अनुमान विधि आपके कक्षों के लिए किसी न किसी मान का उपयोग कर सकती है, और इसे तब कहा जाएगा जब तालिका दृश्य प्रारंभ में लोड हो जाएगा। यह UIKit को स्क्रॉलबार जैसी चीजों को आकर्षित करने में मदद करता है, जिसे तब तक नहीं खींचा जा सकता जब तक कि टेबलव्यू नहीं जानता कि यह कितनी सामग्री तक स्क्रॉल कर सकता है, लेकिन पूरी तरह से सटीक आकारों की आवश्यकता नहीं है, क्योंकि यह सिर्फ एक स्क्रॉलबार है। यह वास्तविक पंक्ति ऊंचाई की गणना को तब तक स्थगित रखने की अनुमति देता है जब तक कि सेल की आवश्यकता नहीं होती है, जो कम कम्प्यूटेशनल रूप से गहन है और आपके UITableView को जल्दी प्रस्तुत किया जा सकता है।


3
यह इस चेतावनी के मूल कारण की एक महान व्याख्या है। अपने समय के लिए बहुत कुछ, वुडस्टर!
गोल्डन थम्ब

4
जैसा कि वुडस्टर ने कहा था, मैंने कमी का सामना किया। जब जोड़ा मेरी समस्या हल हो गई।
गोल्डन थम्ब

लगभग 20 चीजों की कोशिश करने के बाद, यह एकमात्र ऐसा काम है!
जूलियो रॉड्रिक्स ने

इस आदमी ने इसे नंगा कर दिया! वह योग्य और उत्थान करने वाला है और यह स्वीकृत उत्तर होना चाहिए। +1
कैरेबियन

1
यह देखने के लिए कि कौन सी सेल में कमी आ रही है, यह जानने के लिए इस उत्तर को देखें stackoverflow.com/a/29565073/4080860
हानेसैंड

11

कस्टम बनाने UITableViewCellऔर उसके बजाय सेल में मेरे साक्षात्कार जोड़ने के बाद मुझे यह समस्या थी contentView


10

प्रोग्रामेटिक विधि के बिना इसे हल करने के लिए, स्टोरीबोर्ड से आकार निरीक्षक में तालिका दृश्य की पंक्ति ऊंचाई समायोजित करें।

यहाँ छवि विवरण दर्ज करें


मेरे लिए सबसे अच्छा समाधान क्योंकि स्टोरीबोर्ड सामान का उपयोग लाइनों के बजाय कोड के लिए किया गया है।
जाइक

6

यह एक ऑटोलॉययट मुद्दा है। सुनिश्चित करें कि आपके साक्षात्कार में सभी अड़चनें हैं। मेरे लिए, कक्ष में शीर्षक लेबल के लिए निचला अवरोध गायब था। जब मैंने इसे जोड़ा, तो चेतावनी चली गई और सब कुछ पूरी तरह से दिखाई दिया।


पता नहीं क्यों यह अपमानजनक था, क्योंकि यह पूरी तरह से एक अच्छा जवाब है। यह जानने के लिए यहां देखें कि कौन से सेल में समस्‍या होने की समस्‍या है, जिसे stackoverflow.com/a/29565073/4080860
hhanesand

5

बस सेल्फ-साइज़िंग टेबल व्यू सेल को सक्षम करें

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

और सुनिश्चित करें कि आपने सभी बाधाओं को जोड़ा UITableViewCellहै-

यहाँ छवि विवरण दर्ज करें


वास्तव में, चेतावनी तब चली गई जब मैंने स्वयं-सिज़िग टेबलव्यू कोशिकाओं को अक्षम कर दिया
12

@turingtested आपको विभिन्न उपकरणों पर समर्थन देने के लिए स्व-आकार तालिका तालिका सेल सक्षम करना चाहिए।
जैक

सहमत हैं, लेकिन कृपया मूल प्रश्न पढ़ें। मेरा मतलब यह था कि आपके सुझाए गए समाधान से काम नहीं चला, कम से कम मेरे लिए नहीं।
9

FYI UITableViewAutomaticDimensionका नाम बदलकरUITableView.automaticDimension
atineoSE

5

यदि आप स्थैतिक सेल या डायनेमिक सेल का उपयोग कर रहे हैं, तो बस निरीक्षक तालिका में तालिका दृश्य में कुछ पंक्ति ऊंचाई जोड़ें और पंक्ति ऊंचाई के दाईं ओर स्वचालित को अनचेक करें, यही है कि यह चेतावनी प्राप्त करना बंद कर देगा।यहाँ छवि विवरण दर्ज करें


मैंने विपरीत को अधिक प्रभावी पाया: एक स्पष्ट अनुमानित ऊंचाई सेट करें, और पंक्ति की ऊंचाई को स्वचालित होने दें।
NRitH

4

मुझे आज यह चेतावनी मिली। यहाँ है क्या यह मेरे लिए गायब हो गया (इंटरफ़ेस बिल्डर में)

1. सेट तालिका के लिए पंक्ति ऊँचाई फ़ील्ड को किसी अन्य चीज़ से देखें 44 2 के लिए पंक्ति ऊँचाई फ़ील्ड पर तालिका दृश्य कक्ष के लिए कुछ अन्य 44 पर सेट करें

मुझे कोड में कोई बदलाव नहीं करना था


3

मेरे मामले में, मैं सेल को प्रोग्रामेटिक रूप से बना रहा था और यह त्रुटि प्राप्त करता रहा।

मैं subviews और में कमी जोड़ने था UITableViewCellकी initइस तरह विधि:

addSubview(rankingLabel)
addConstraints(cellConstraints)

मैंने सेल के contentViewबजाय उन्हें जोड़कर समस्या हल की :

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)

1
हमेशा contentView, UITableViewCellसीधे नहीं, के लिए साक्षात्कार जोड़ें ।
दिनेशर्जनी

3

अनुमानित पंक्ति ऊंचाई शून्य पर सेट करें और चेतावनी गायब हो जाती है:

यहाँ छवि विवरण दर्ज करें


असली समस्या कहीं न कहीं एक कमी है। आप शायद
TruMan1

1

मुझे भी Xcode 6 GM पर जाने के साथ इस चेतावनी का अनुभव हुआ। मुझे केवल चेतावनी मिल रही थी जब मैंने डिवाइस को उसकी मूल स्थिति में वापस घुमाया।

मैं कस्टम UITableViewCells का उपयोग कर रहा हूं। स्टोरीबोर्ड तालिका दृश्य मेरे कस्टम आकार (मेरे मामले में 100.0) पर सेट है। जबकि टेबल सेल ठीक से प्रस्तुत करते हैं जैसा कि उनके पास पिछले रिलीज में है, मुझे चेतावनी संदेश पसंद नहीं आया।

उपरोक्त विचारों के अलावा, मैंने इसे जोड़ा

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

स्क्रीन रेंडर ... रोटेशन का जवाब देता है और कोई चेतावनी संदेश नहीं।


इसलिए मैंने आपके द्वारा मुझे दी गई लाइन का उपयोग करके अपने तरीके का उपयोग करने की कोशिश की है लेकिन मैं अभी भी उसी त्रुटि के साथ आता हूं। मैं अपने ऐप में रोटेशन का उपयोग भी नहीं कर रहा हूं।
डेविड ई।

1

Xcode 6.0.1 में मैंने इस चेतावनी को हटा दिया था जिसमें पंक्ति ऊंचाई का उपयोग करके निर्दिष्ट किया गया था:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}

1

यदि आपने tableView के लिए एक कस्टम टेबल व्यूकोड बनाया है, तो सुनिश्चित करें कि आपने नीचे और ऊपर की दोनों बाधाओं को आप कोशिकाओं को दे दिया है, आप यह संदेश भी प्राप्त कर सकते हैं यदि कस्टम सेल के अंदर आपके साक्षात्कार केंद्र Y में संरेखित हैं जो किसी भी त्रुटि संदेश को पॉप करेगा, लेकिन गड़बड़ करेगा छवि में जैसे मैंने संलग्न किया है, टेबलव्यू के लिए पंक्ति की ऊंचाई की पहचान के साथ , यहां हमारे पास ऊपर और नीचे दोनों बाधाएं हैं

जब आप tableView के लिए एक कस्टम सेल बनाते हैं, तो आपको सेल के अंदर कस्टम सेल के सबव्यूशंस के लिए विशिष्ट पंक्ति ऊँचाई या ऊपर और नीचे की सीमाएँ होनी चाहिए (जैसे नीचे चित्र में कस्टम सेल में लेबल)

लेकिन अगर यह काम नहीं करता है तो आप इस छवि की तरह स्वचालित होने के बजाय अपने सेल के लिए पंक्ति ऊँचाई सेट करने का प्रयास कर सकते हैं

लेकिन सुनिश्चित करें कि यदि आप उस स्वचालित टिक को बंद करते हैं, तो आपको अपने पंक्ति आकार को प्रोग्रामेटिक रूप से परिवर्तनों के लिए समायोजित करना होगा जो कि स्वचालित रूप से किया जा सकता था


0

स्टोरीबोर्ड में सेट cell Row heightके रूप में एक ही मूल्य के साथ मैदान Row heightमें tableView(एक ही मूल्य मेरे लिए काम किया साथ दोनों)।

यदि आप heightForRowAtIndexPathअपने कोड में फ़ंक्शन जोड़ते हैं तो यह एक प्रदर्शन समस्या को प्रेरित कर सकता है क्योंकि यह प्रत्येक सेल के लिए कहा जाएगा इसलिए सावधान रहें।


0

आप इस संदेश को भी देख सकते हैं यदि आपकी एकमात्र बाधा खड़ी सभी वस्तुओं को संरेखित करने के लिए निर्धारित है और आपके पास सेल के लिए निर्दिष्ट ऊंचाई नहीं है / नहीं है। यदि आप आइटम पर एक शीर्ष / निचला बाधा सेट करते हैं, तो चेतावनी गायब हो जाएगी।


0

मुझे यह समस्या तब हुई जब कस्टम टेबल व्यूसेल में मेरे लेबल और विचार कस्टमकेल के लिए विवश थे, इसके कंटेंट व्यू में नहीं। जब मैंने बाधाओं को साफ किया और उन्हें कोशिकाओं से जोड़ा तो सामग्री देखें समस्या हल हो गई।


0

मेरे पास एक ही त्रुटि संदेश था, सुनिश्चित करें कि आपके सभी आउटलेट टेबल व्यू और टेबलव्यू बाधाओं की तरह मान्य हैं


0

यदि आप एक गतिशील ऊंचाई की गणना कर रहे हैं,

  • आपके पास ऊपर और नीचे की बाधाओं की तरह सभी तत्व एक-दूसरे से जुड़े होने चाहिए।
  • आपको निश्चित रूप से एक निचला अवरोध होना चाहिए जो आपके सेल के नीचे तत्व से जुड़ा हुआ है

0

मेरे पास कस्टम टेबलव्यू सेल के लिए भी समान मुद्दा है जिसमें गतिशील पंक्ति ऊंचाई है। गतिशील ऊंचाई परिलक्षित नहीं हुई और कंसोल में एक ही चेतावनी मिली। समाधान contentView के बजाय सेल में साक्षात्कार जोड़ रहा है। बीटीडब्लू, मैंने प्रोग्राम्स को सब-प्रोग्राम बनाया है।


0

मेरे पास यह मुद्दा है कि TableViewCellजहां अवरोधों को आरंभीकरण पर सेट किया गया है, लेकिन जहां सेल की सामग्री बाद में भरी हुई है, इसका मतलब है कि ऑटोलयूट इंजन ऊंचाई निर्धारित नहीं कर सकता है। यहां अन्य समाधान काम नहीं करते हैं क्योंकि मुझे सेल की ऊंचाई की आवश्यकता है UITableView.automaticDimension

मैंने अभी सेल में एक अतिरिक्त बाधा जोड़ी है:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)

0

मुझे आज यह वार्निंग मिली है कि मैंने केवल अपने कोड में एक अतिरिक्त लाइन जोड़ी है

tableView.rowHeight = 200;

कोड की इस लाइन को अंदर जोड़ें

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

और अंतिम कोड जैसा दिखता है

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

यह कोड तालिका पंक्ति सेल ऊंचाई को बढ़ाकर 200 कर देगा डिफ़ॉल्ट ऊंचाई 44 है


-1

मेरे पास एक ही त्रुटि है, इस रेखा के कारण यह त्रुटि दिखाई गई थी।

self.layer.backgroundColor = UIColor (सफेद: 1, अल्फा: 0.2) के रूप में! CGColor

मैं सिर्फ त्रुटि को ठीक करने के लिए लाइन को बदलता हूं

self.layer.backgroundColor = UIColor (सफेद: 1, अल्फा: 0.2) .cgColor

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.