2013-07-10 10 views
19

विफल रहता है I UITEableViewCells के लिए ऑटो-लेआउट का उपयोग करना चाहता हूं। इन तालिका कक्षों में गतिशील ऊंचाई होती है (पाठ की लंबाई के आधार पर)।एक UITableViewCell पर 'UIView -systemLayoutSizeFittingSize:]' को कॉल करना हमेशा

मैं [UIView -systemLayoutSizeFittingSize:] उपयोग कर रहा हूँ ([UITableView -heightForRowAtIndexPath:] में वापस जाने के लिए) उचित सेल ऊंचाई की गणना करने के, लेकिन मैं निम्नलिखित परिणाम प्राप्त हो रही है:

  • अगर मैं UILayoutFittingCompressedSize गुजरती हैं, मैं वापस की एक CGSize (0 मिलता है, 0)।

  • अगर मैं UILayoutFittingExpandedSize गुजरती हैं, इस त्रुटि के साथ मेरी ऐप्लिकेशन क्रैश:

    *** Assertion failure in -[NSISLinearExpression incrementConstant:], /SourceCache/Foundation_Sim/Foundation-1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620

(मेरा अनुमान है इसका मतलब है कि कुछ संख्या अनंत है।)

मेरे कार्यान्वयन सरल है। मैं प्रत्येक वस्तु के लिए ऊंचाई की गणना, और फिर इसे कैश:

MessageCell *cell = // allocate a new cell... 

// set up the cell (assign text, images, etc) 

CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

self.cellHeight = size.height; // size always equals (0, 0) 

मैं परिकल्पना है कि इस कमी मैं सेट के साथ एक समस्या है, लेकिन:

  • अगर मैं मैन्युअल रूप से एक बड़े मूल्य के लिए cellHeight सेट , कोशिकाओं को छोड़कर सभी ठीक ठीक दिखते हैं।
  • इंटरफ़ेस बिल्डर मुझे संदिग्ध संयम के बारे में कोई चेतावनी नहीं देता
  • [cell hasAmbiguousLayout]NO देता है।
  • मेरा सेल, अन्य चीजों के साथ, 48x48 पर एक छवि सेट है, इसलिए (0, 0) का आकार सभी बाधाओं को पूरा नहीं करना चाहिए।

कोई विचार?

+1

मैं अपने रूप में एक ही बग मिलते हैं, आप इसे ठीक है? – ygweric

उत्तर

34

यह वही मेरे लिए काम करता है (ध्यान दें 'contentView')

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

है संपादित करें: मैं एक ऐसी ही सवाल पूर्ण उदाहरण यहां के जवाब दिए और प्रदान की,:

How to resize superview to fit all subviews with autolayout?

+1

यह मेरे लिए काम किया। – Camsoft

+0

यह मेरे लिए कुंजी थी। अगर मेरे पास मेरी ऑटो लेआउट बाधाएं सही हैं, तो मुझे केवल [UITableView -heightForRowAtIndexPath:] में वापस करने की आवश्यकता है [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize] .height; और पंक्तियां उनके नए लेआउट में आकार बदलती हैं। सरल। –

2

अपनी पोस्ट पर कुछ ठोस आधार कहना मुश्किल है क्योंकि आपने उपयोग की जाने वाली बाधाओं को पोस्ट नहीं किया है। एप्पल प्रलेखन:

systemLayoutSizeFittingSize:

Returns the size of the view that satisfies the constraints it holds.

शायद तुम बाधाओं कि जिस तरह से सेल के आकार (0,0) के बराबर है में व्याख्या की जा सकती बनाया।

एक और तरीका है कि आप पाठ के साथ सेल की ऊंचाई की जांच कर सकते हैं। आप UITextView में अपना पाठ डाल सकते हैं और उसके बाद:

UITextView textView; 
textView.text = @"l"; 
textView.font = [UIFont fontWithName:FONT_NAME size:FONT_SIZE]; 
//some code here 
// 
CGFloat cellHeight = textView.contentSize.height; 

यह contentSize उपयोग करने से पहले UITextView का पाठ और फ़ॉन्ट (और हर दूसरे की संपत्ति है कि UITextView की ऊंचाई के परिवर्तन पैदा कर सकता है) स्थापित करने के लिए महत्वपूर्ण है संपत्ति। इसके अलावा आपको पहले दृश्य में UITextView जोड़ना होगा।

////// संपादित

की कमी का उपयोग कर किया जा सकता है कि आप सेल जो जोड़ा नहीं गया है को देखने के लिए इतना प्रणाली सभी की जरूरत नहीं है का आकलन करना चाहते के साथ अपने दृष्टिकोण के साथ समस्या यह

सूचनाओं की जरूरत है।यह कितनी जगह है कि अंतरिक्ष आदि के लिए किया जाएगा पता नहीं है, क्योंकि यह सेल के आसपास के क्षेत्र में पता नहीं है

+0

बाद का दृष्टिकोण वह है जो मैं अब कर रहा हूं, और मैं क्या करना बंद करना चाहता हूं। (ठीक है, मैं '[NSString -sizeWithFont: constrainedToSize:]' का उपयोग कर रहा हूं, लेकिन वही मूल विचार)। मेरे UITableViewCell में एक सबव्यूव, UIImageView है, जिसमें चार बाधाएं हैं (ऊंचाई = 48, चौड़ाई = 48, कंटेनर = 10 के लिए अग्रणी स्थान, कंटेनर = 10 के लिए शीर्ष स्थान)। क्या वह अकेले नहीं हो सकता है 'systemLayoutSizeFittingSize: 'वापसी, कम से कम, (58, 58)? –

+0

ऐसा लगता है जैसे इसे काम करना चाहिए। आप अपनी छवि UIImageView में रखते हैं और इसे सेल व्यू में जोड़ा जाता है? साथ ही, मुझे लगता है कि UITextView का उपयोग करने के साथ यह विचार शायद एनएसएसटींग विधियों का उपयोग करने से बेहतर है क्योंकि मल्टीलाइन स्ट्रिंग के साथ काम करते समय मुझे एनएसएसटींग के साथ कुछ समस्याएं थीं। –

संबंधित मुद्दे