स्टोरीबोर्ड में कस्टम सेल रो ऊँचाई सेटिंग जवाब नहीं दे रही है


213

मैं अपने टेबल व्यू पर कोशिकाओं में से एक के लिए सेल की ऊंचाई को समायोजित करने की कोशिश कर रहा हूं। मैं प्रश्न में सेल के "आकार निरीक्षक" के अंदर "पंक्ति ऊंचाई" सेटिंग से आकार समायोजित कर रहा हूं। जब मैं अपने iPhone पर ऐप चलाता हूं तो सेल में टेबल व्यू में "पंक्ति आकार" से डिफ़ॉल्ट आकार सेट होता है।

यदि मैं तालिका दृश्य के "पंक्ति आकार" को बदल देता हूं तो सभी कोशिकाओं का आकार बदल जाता है। मैं ऐसा नहीं करना चाहता हूं क्योंकि मैं केवल एक सेल के लिए एक कस्टम आकार चाहता हूं। मैंने बहुत सी पोस्ट देखी हैं जिनमें समस्या का एक प्रोग्रामेटिक समाधान है, लेकिन मैं इसे स्टोरीबोर्ड के माध्यम से करना पसंद करूंगा, अगर यह संभव है।

जवाबों:


295

पर गतिशील कोशिकाओं, rowHeightUITableView पर सेट हमेशा व्यक्तिगत कोशिकाओं 'rowHeight ओवरराइड करता है।

लेकिन स्थैतिक कोशिकाओं पर, rowHeightअलग-अलग कोशिकाओं पर सेट UITableView को ओवरराइड कर सकता है।

यकीन नहीं है कि अगर यह एक बग है, तो Apple जानबूझकर ऐसा कर सकता है?


36
सही उत्तर # 3, और विशेष रूप से क्योंकि यह उत्तर इंटरफ़ेस बिल्डर / स्टोरीबोर्ड पर लागू होता है। आप चयन करते हैं सेल आईबी में है, तो आकार इंस्पेक्टर शीर्ष पर शो पंक्ति ऊँचाई (एक "कस्टम" चेकबॉक्स के साथ), लेकिन आप पूरे चयन करता है, तो तालिका देखें आकार इंस्पेक्टर वहाँ शीर्ष भी (कोई "कस्टम में शो पंक्ति ऊंचाई " इस मामले में)। जैसा कि पिक्सफ्रीक कहता है, डायनेमिक सेल्स के लिए केवल टेबल व्यू सेटिंग का उपयोग किया जाता है। (यकीन नहीं होता अगर यह जानबूझकर है)
Rhubarb

8
यह उत्तर बताता है कि समाधान केवल UITableViewसामग्री को बदलने के Dynamic Prototypesलिए होगा Static Cells, मैंने ऐसा किया, और मेरी पूरी परियोजना को उड़ा दिया .. लगभग खुद को मार डाला।
abbood

4
क्या इस संख्या को पुनः प्राप्त करने का कोई तरीका है? क्या इसे खोदने का एकमात्र तरीका स्टोरीबोर्ड में गोता लगाना और इसे वहां से बाहर निकालना है?
बिच्लोप्स

यह निश्चित रूप से बग नहीं है, क्योंकि आपकी तालिका गतिशील है, इसलिए सिस्टम को कैसे पता चल सकता है कि आपका सेल उन कोशिकाओं में से प्रत्येक का उपयोग कहां करता है? और कितनी बार प्रत्येक प्रोटोटाइप का उपयोग किया जाएगा।
विनसेंट बर्नियर

ऐसा प्रतीत होता है कि कोई समस्या है यदि आप शुरू में "स्थिर कोशिकाओं" के रूप में एक तालिका दृश्य सेट करते हैं और फिर इसे "डायनामिक प्रोटोटाइप" में बदल देते हैं। मेरे पास एक मुद्दा था, जहां रोहाइट के लिए प्रतिनिधि पद्धति को भी अनदेखा किया जा रहा था। मैंने पहले स्टोरीबोर्ड XML को सीधे संपादित करके इसे हल किया, फिर अंत में स्टोरीबोर्ड दृश्य को खरोंच से फिर से बनाया गया, शुरू से डायनामिक प्रोटोटाइप का उपयोग करके।
एरिक गोल्डबर्ग

84

यदि आप UITableViewController का उपयोग करते हैं, तो इस विधि को लागू करें:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

एक पंक्ति के कार्य में आप ऊँचाई चुन सकते हैं। उदाहरण के लिए,

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
       return 100;
    } 
    else {
       return 60;
    }
}

इस छूट में, पहली पंक्ति की ऊंचाई 100 पिक्सेल है, और अन्य 60 पिक्सेल हैं।

मुझे उम्मीद है कि यह आपकी मदद कर सकता है।


2
बीबर, क्या एक हमेशा दोनों को करना होता है (कस्टमबोर्ड की जाँच करें और स्टोरीबोर्ड में & quot; रो ऊंचाई को संपादित करें && इसे ऊँचाई में निर्दिष्ट करें RowAtIndexPath)?
मारसियोकोको

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

34

गतिशील कोशिकाओं के लिए, rowHeightपर सेट UITableViewहमेशा व्यक्तिगत कोशिकाओं 'को ओवरराइड करता है rowHeight

यह व्यवहार, IMO, बग है। कभी भी आपको अपने यूआई को दो स्थानों पर प्रबंधित करना होगा यह त्रुटि का खतरा है। उदाहरण के लिए, यदि आप स्टोरीबोर्ड में अपना सेल आकार बदलते हैं, तो आपको उन्हें भी बदलना होगा heightForRowAtIndexPath:। जब तक ऐप्पल बग को ठीक नहीं करता है, तब तक सबसे अच्छा वर्कअराउंड ओवरराइड करना है heightForRowAtIndexPath:, लेकिन मैजिक नंबरों का उपयोग करने के बजाय ऊंचाई निर्धारित करने के लिए स्टोरीबोर्ड से वास्तविक प्रोटोटाइप कोशिकाओं का उपयोग करें । यहाँ एक उदाहरण है:

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* In this example, there is a different cell for
       the top, middle and bottom rows of the tableView.
       Each type of cell has a different height.
       self.model contains the data for the tableview 
    */
    static NSString *CellIdentifier;
    if (indexPath.row == 0) 
        CellIdentifier = @"CellTop";
    else if (indexPath.row + 1 == [self.model count] )
        CellIdentifier = @"CellBottom";
    else
        CellIdentifier = @"CellMiddle";

    UITableViewCell *cell = 
              [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    return cell.bounds.size.height;
}

यह आपके प्रोटोटाइप सेल हाइट्स में किसी भी बदलाव को सुनिश्चित करेगा स्वचालित रूप से रनटाइम पर उठाया जाएगा और आपको केवल एक जगह अपने यूआई को प्रबंधित करने की आवश्यकता है: स्टोरीबोर्ड।


2
मैंने कैशिंग सहित पूर्ण कोड के साथ एक उत्तर पोस्ट किया है; देखें stackoverflow.com/a/16881312/292166
जोसेफ

1
वाह वाह वाह! मैंने उत्तर दिया, लेकिन सावधान रहो! इस विधि के कारण नॉन परफॉर्मेंस पेनल्टी ही लगती है जैसा कि टिप्पणियों में @ ब्रेनन ने कहा है, यह प्रत्येक रीलोडाटा में मेमोरी लीक जैसी किसी चीज के कारण मेमोरी आवंटन बढ़ने का कारण बनता है! ऊपर लेंसोवेट के वर्कअराउंड का उपयोग करना आवश्यक है! इस स्मृति रिसाव को पकड़ने के लिए एक दिन बिताएं!
स्काइविंदर

स्विफ्ट में काम नहीं करता है, क्योंकि cell.bounds.size.height हमेशा 0.0
राजा-जादूगर

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

1
इसके अलावा, आपको अपने स्वयं के सेलफ़ोररॉइट इंडेक्सएक्सपैथ विधि को कॉल नहीं करना चाहिए। तालिका दृश्य में एक सेलफ़ोरराउटइंडेक्सपैथ पद्धति है जो उस सूचकांक पथ के लिए एक सेल लौटाएगा यदि यह वर्तमान में स्क्रीन पर दिखाई देता है, लेकिन अक्सर यह कि सूचकांक पथ में इसके साथ जुड़ा हुआ सेल नहीं है।
राजा-जादूगर

22

मैंने कोड को विभिन्न उत्तरों / टिप्पणियों को इंगित करने के लिए बनाया है ताकि यह स्टोरीबोर्ड के लिए काम करे जो प्रोटोटाइप कोशिकाओं का उपयोग करता है।

यह कोड:

  • स्टोरीबोर्ड में स्पष्ट स्थान के अलावा कहीं भी सेल ऊंचाई निर्धारित करने की आवश्यकता नहीं है
  • प्रदर्शन कारणों के लिए ऊंचाई को कैश करता है
  • डुप्लिकेट लॉजिक से बचने के लिए इंडेक्स पथ के लिए सेल आइडेंटिफायर प्राप्त करने के लिए एक सामान्य फ़ंक्शन का उपयोग करता है

उत्तरपट्टी, ब्रेनन और लेंसोवेट के लिए धन्यवाद।

- (NSString *)cellIdentifierForIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = nil;

    switch (indexPath.section)
    {
        case 0:
            cellIdentifier = @"ArtworkCell";
            break;
         <... and so on ...>
    }

    return cellIdentifier;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = [self cellIdentifierForIndexPath:indexPath];
    static NSMutableDictionary *heightCache;
    if (!heightCache)
        heightCache = [[NSMutableDictionary alloc] init];
    NSNumber *cachedHeight = heightCache[cellIdentifier];
    if (cachedHeight)
        return cachedHeight.floatValue;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    CGFloat height = cell.bounds.size.height;
    heightCache[cellIdentifier] = @(height);
    return height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = [self cellIdentifierForIndexPath:indexPath];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    <... configure cell as usual...>

मुझे पता है कि यह एक पुराना उत्तर है, लेकिन क्या किसी और को यह पता चलता है कि यह एक स्टैक ओवरफ्लो है? जब दृश्य लोड होता है, तो मुझे UISectionRowData रिफ्रेशवॉट मिलता है: tableViewRowData: जो tableView कहता है: heightForRowAtIndexPath: जिसे dequeueReusableCelladithIdentifier कहते हैं: जिसे [UISectionRowData ...] कहते हैं, इसलिए मेरे पास एक पुनरावर्ती स्टैक है। मैं वास्तव में इस समाधान का उपयोग करना चाहता था, लेकिन यह iOS7 के साथ काम नहीं करता है।
sbaker

स्विफ्ट में काम नहीं करता, क्योंकि cell.bounds.size.height हमेशा 0.0 लौटाता है
King-Wizard

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

इसके अलावा, आपको अपने स्वयं के सेलफ़ोररॉइटइंडेक्सपैथ विधि को कॉल नहीं करना चाहिए। तालिका दृश्य में एक सेलफ़ोरराउटइंडेक्सपैथ पद्धति है जो उस सूचकांक पथ के लिए एक सेल लौटाएगा यदि यह वर्तमान में स्क्रीन पर दिखाई देता है, लेकिन अक्सर यह कि सूचकांक पथ में इसके साथ जुड़ा हुआ सेल नहीं है।
राजा-जादूगर

@ स्नो-टाइगर मैंने यह तेज गति से करने की कोशिश नहीं की है, लेकिन मैं आपकी टिप्पणियों को नहीं समझता। मैं '[my] का अपना सेलफोररॉइट इंडेक्सएक्सपैथ विधि नहीं कहता, और यह जानबूझकर है कि मैं नहीं। मुझे यह भी पता है कि समय सारणी में कोशिकाएँ मौजूद नहीं हैं: heightForRowAtIndexPath कहा जाता है, जो इस कोड का पूरा बिंदु है, और यह सेल प्राप्त करने के लिए dequeueReusableCellWithIdentifier का उपयोग क्यों करता है। इस उत्तर में पोस्ट किया गया कोड काम करता है। या तो स्विफ्ट में कुछ अतिरिक्त चल रहा है, स्विफ्ट रूपांतरण में कुछ सही नहीं है, या एक अलग समस्या को हल करने की कोशिश कर रहे हैं जो यह प्रश्न / उत्तर लक्ष्य करता है।
जोसेफ

19

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


टेबलव्यू (सेलव्यू नहीं)> साइज इंस्पेक्टर टैब में> पंक्ति की ऊंचाई
iman kazemayni

हर बार जब मैं इस विवरण को भूल जाता हूं तो मुझे पागल कर देता है। स्टोरीबोर्ड का उपयोग करते समय सेल को समायोजित करने का कोई विचार तालिका दृश्य को स्वचालित रूप से अपडेट नहीं करता है!
स्कूटर

11

मुझे लगता है कि यह एक बग है।

उपयोगिता निरीक्षक द्वारा नहीं बल्कि सीधे स्टोरीबोर्ड पर माउस ड्रैग द्वारा ऊंचाई समायोजित करने का प्रयास करें।

मैंने इस विधि से इस समस्या को हल किया।


10

यदि आप स्विफ्ट का उपयोग कर रहे हैं, तो इस तरह का उपयोग करें। पंक्ति ऊंचाई का चयन करने के लिए स्टोरीबोर्ड का उपयोग न करें। प्रोग्राम टेबल तालिका ऊंचाई इस तरह सेट करें,

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.row == 0 || indexPath.row == 1{
        let cell = self.tableView.dequeueReusableCellWithIdentifier("section1", forIndexPath: indexPath) as! Section1TableViewCell
        self.tableView.rowHeight = 150
        cell.label1.text = "hiiiiii"
        cell.label2.text = "Huiiilllllll"
        return cell

    } else {

        let cell = self.tableView.dequeueReusableCellWithIdentifier("section2", forIndexPath: indexPath) as! Section2TableViewCell
        self.tableView.rowHeight = 60
        cell.label3.text = "llll"
        return cell
    }

}

यह काम करता है, लेकिन आम तौर पर आप यह कर सकते हैं:cell.sizeToFit(); self.tableView.rowHeight = cell.frame.height
एंडी चो

7

आप निम्न लाइनों की मदद से स्टोरीबोर्ड से UITableviewCell (UITableviewController - static cells में) की ऊंचाई प्राप्त कर सकते हैं।

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   CGFloat height = [super tableView:tableView heightForRowAtIndexPath:indexPath];

    return height;
}

6

XML दृश्य में स्टोरीबोर्ड खोलें और rowHeightवांछित तत्व की विशेषता को संपादित करने का प्रयास करें ।

यह मेरे लिए तब काम आया जब मैंने अपनी प्रोटोटाइप पंक्ति के लिए कस्टम रो हाइट सेट करने की कोशिश की। यह इंस्पेक्टर के माध्यम से काम नहीं कर रहा है, लेकिन एक्सएमएल के माध्यम से यह काम करता है।


1
मैंने राइट-क्लिक किया और "Open as" -> "source code" चुना। रोहाइट पहले से ही 120 पर सेट था। मेरा मानना ​​है कि स्टोरीबोर्ड में एक बग है और यह कस्टम सेल की ऊँचाई को अनदेखा करता है।
जिरिनिस्प

6

आप cellsएक कस्टम के साथ प्रोटोटाइप का उपयोग कर सकते हैं height, और फिर आह्वान cellForRowAtIndexPath:और इसे वापस कर सकते हैं frame.height।:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView
                    cellForRowAtIndexPath:indexPath];
    return cell.frame.size.height;
}

इस विधि के अलावा बहुत अच्छी तरह से काम किया है, और अब स्टोरीबोर्ड में सभी अनुकूलन रख रहे हैं जैसा कि यह होना चाहिए।
डासपियन

अब तक का सबसे अच्छा समाधान
TheJeff

4

यदि आप एक स्थिर पंक्ति ऊंचाई सेट करना चाहते हैं, तो आप कुछ इस तरह कर सकते हैं:

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

4

मैं हाल ही में इससे कुश्ती कर रहा हूं। मेरा मुद्दा था कि सॉल्यूशंस का उपयोग करके ऊपर पोस्ट किए गए समाधान heightForRowAtIndexPath:सिम्युलेटर में iOS 7.1 के लिए काम करेंगे, लेकिन फिर केवल iOS 8.1 पर स्विच करके परिणामों को पूरी तरह से खराब कर दिया है।

मैंने स्वयं-आकार वाली कोशिकाओं (iOS 8 में पेश किया गया, यहां पढ़ें ) के बारे में अधिक पढ़ना शुरू किया । यह स्पष्ट था कि UITableViewAutomaticDimensionआईओएस 8 का उपयोग करने में मदद मिलेगी। मैंने उस तकनीक का उपयोग करने की कोशिश की heightForRowAtIndexPath:और वॉयला का उपयोग हटा दिया , यह अब iOS 8 में एकदम सही काम कर रहा था। लेकिन तब iOS 7 नहीं था। मुझे क्या करने की जरूरत थी? मुझे heightForRowAtIndexPath:iOS 7 के लिए जरूरत थी न कि iOS 8 के लिए।

यहां मेरा समाधान है (संक्षिप्तता के लिए छंटनी की गई) जो उत्तर @JosephH से उधार ली गई है:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.estimatedRowHeight = 50.;
    self.tableView.rowHeight = UITableViewAutomaticDimension;

    // ...
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
        return UITableViewAutomaticDimension;

    } else {
        NSString *cellIdentifier = [self reuseIdentifierForCellAtIndexPath:indexPath];
        static NSMutableDictionary *heightCache;
        if (!heightCache)
            heightCache = [[NSMutableDictionary alloc] init];
        NSNumber *cachedHeight = heightCache[cellIdentifier];
        if (cachedHeight)
            return cachedHeight.floatValue;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    CGFloat height = cell.bounds.size.height;
    heightCache[cellIdentifier] = @(height);
    return height;
    }
}

- (NSString *)reuseIdentifierForCellAtIndexPath:(NSIndexPath *)indexPath {
    NSString * reuseIdentifier;
    switch (indexPath.row) {
        case 0:
            reuseIdentifier = EventTitleCellIdentifier;
            break;
        case 2:
            reuseIdentifier = EventDateTimeCellIdentifier;
            break;
        case 4:
            reuseIdentifier = EventContactsCellIdentifier;
            break;
        case 6:
            reuseIdentifier = EventLocationCellIdentifier;
            break;
        case 8:
            reuseIdentifier = NotesCellIdentifier;
            break;
        default:
            reuseIdentifier = SeparatorCellIdentifier;
            break;
    }

    return reuseIdentifier;
}

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO (@ "8.0") वास्तव में मैक्रो परिभाषाओं के एक सेट से है जिसका मैं उपयोग कर रहा हूं जो मैंने कहीं (बहुत उपयोगी) पाया। उन्हें इस प्रकार परिभाषित किया गया है:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

2

स्विफ्ट 4 का उपयोग करते हुए XCode 9 पर काम करते समय भी यही समस्या थी ।

सेल के अंदर UI तत्वों के लिए AutoLayout जोड़ें और कस्टम सेल पंक्ति ऊंचाई निर्दिष्ट के अनुसार काम करेगी।


1
हाय, कृपया आपने ऐसा कैसे किया?
बैक पैकर

आपको बस कक्ष के निचले भाग में एक बाधा सेट जोड़ने की आवश्यकता है।
जस्टिन

जब मैं ऐसा करता हूं और सेल ऊंचाई के लिए स्टोरीबोर्ड में "स्वचालित" का चयन करता हूं, तो यह स्टोरीबोर्ड में 44 तक सभी ऊंचाइयों को सेट करना चाहता है, हालांकि यह सही है जब मैं चलाता हूं। मैं सही ढंग से प्रदर्शित करने के लिए स्टोरीबोर्ड कैसे प्राप्त कर सकता हूं?
डेविड

1

डायनेमिक कोशिकाओं के लिए, यूआईटेबल व्यू पर स्थित पंक्तिहाइट हमेशा अलग-अलग कोशिकाओं की पंक्तिहाइट को ओवरराइड करता है। यदि पंक्ति के अंदर सामग्री है तो बस गतिशील ऊंचाई की गणना करें।


0

एकमात्र वास्तविक समाधान जो मैं पा सकता था, वह यह है

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = ...; // Instantiate with a "common" method you'll use again in cellForRowAtIndexPath:
    return cell.frame.size.height;
}

यह काम करता है और StoryBoard में पहले से ही तर्क की नकल करते हुए एक भयानक स्विच नहीं होने देता है। प्रदर्शन के बारे में निश्चित नहीं है, लेकिन मुझे लगता है cellForRow:कि सेल में पहुंचने से पहले से ही यह तेजी से बाधित हो रहा है। बेशक यहाँ संपार्श्विक नुकसान हैं, लेकिन ऐसा लगता है कि यह मेरे लिए यहाँ ठीक काम करता है।

मैंने इसे यहाँ भी पोस्ट किया: https://devforums.apple.com/message/772464

EDIT: Ortwin Gentz ने मुझे याद दिलाया कि केवल दृश्यमान लोगों की ही नहीं, TableView की सभी कोशिकाओं के heightForRowAtIndexPath:लिए भी कॉल किया जाएगा । तार्किक लगता है क्योंकि iOS को सही स्क्रॉलबार दिखाने में सक्षम होने के लिए कुल ऊंचाई जानने की आवश्यकता है। इसका मतलब है कि यह शायद छोटे TableViews (20 सेल की तरह) पर ठीक है, लेकिन 1000 सेल TableView पर इसके बारे में भूल जाएं।

इसके अलावा, एक्सएमएल के साथ पिछली चाल: मेरे लिए पहली टिप्पणी के रूप में भी। सही मूल्य पहले से ही था।


0

एक टिप्पणी के रूप में जोड़ा गया, लेकिन दृश्यता के लिए एक उत्तर के रूप में पोस्टिंग:

ऐसा प्रतीत होता है कि कोई समस्या है यदि आप शुरू में "स्थिर कोशिकाओं" के रूप में एक तालिका दृश्य सेट करते हैं और फिर इसे "डायनामिक प्रोटोटाइप" में बदल देते हैं। मेरे पास एक मुद्दा था जहां भी प्रतिनिधि पद्धति की heightForRowAtIndexPathअनदेखी की जा रही थी। मैंने पहले स्टोरीबोर्ड XML को सीधे संपादित करके इसे हल किया, फिर अंत में स्टोरीबोर्ड दृश्य को खरोंच से फिर से बनाया गया, शुरू से डायनामिक प्रोटोटाइप का उपयोग करके।


0

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

    import UIKit

    enum SignInUpMenuTableViewControllerCellIdentifier: String {
       case BigButtonCell = "BigButtonCell"
       case LabelCell = "LabelCell"
    }

    class SignInUpMenuTableViewController: UITableViewController {
            let heightCache = [SignInUpMenuTableViewControllerCellIdentifier.BigButtonCell : CGFloat(50),
                              SignInUpMenuTableViewControllerCellIdentifier.LabelCell : CGFloat(115)]

    private func cellIdentifierForIndexPath(indexPath: NSIndexPath) -> SignInUpMenuTableViewControllerCellIdentifier {
        if indexPath.row == 2 {
            return SignInUpMenuTableViewControllerCellIdentifier.LabelCell
        } else {
            return SignInUpMenuTableViewControllerCellIdentifier.BigButtonCell
        }
    }

   override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
       return self.heightCache[self.cellIdentifierForIndexPath(indexPath)]!
   }

   ...

  }

यह सब ठीक है और अच्छा है, लेकिन जब तक मैं कोड को गलत नहीं कर रहा हूं, यह बस जादू की संख्या पर निर्भर करता है और पूरी तरह से गतिशील कोशिकाओं के लिए आईबी में जो भी मूल्य निर्धारित करता है, उसे पूरी तरह से अनदेखा करता है ... ओपी के सवाल का हल नहीं
डैनी

0

एक अन्य चीज़ जो आप कर सकते हैं, वह है अपने दस्तावेज़ की रूपरेखा पर जाना, तालिका दृश्य का चयन करना कि आपका प्रोटोटाइप सेल नेस्टेड है। फिर साइज इंस्पेक्टर पर, अपने टेबल व्यू रो हाइट को अपने इच्छित मूल्य में बदलें और स्वचालित बॉक्स को अनचेक करें।

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