मैं कस्टम सेल के बिना UITableViewCell में टेक्स्ट कैसे लपेट सकता हूं


151

यह iPhone 0S 2.0 पर है। 2.1 के लिए उत्तर भी ठीक हैं, हालांकि मैं तालिकाओं के बारे में किसी भी मतभेद से अनजान हूं।

ऐसा लगता है कि कस्टम सेल बनाए बिना रैप करने के लिए टेक्स्ट प्राप्त करना संभव है, क्योंकि UITableViewCellइसमें UILabelडिफ़ॉल्ट रूप से शामिल है। मुझे पता है कि अगर मैं एक कस्टम सेल बनाता हूं, तो मैं यह काम कर सकता हूं, लेकिन यह वह नहीं है जिसे मैं प्राप्त करने की कोशिश कर रहा हूं - मैं समझना चाहता हूं कि मेरे वर्तमान दृष्टिकोण क्यों काम करते हैं।

मुझे पता चला है कि लेबल मांग पर बनाया गया है (चूंकि सेल पाठ और छवि पहुंच का समर्थन करता है, इसलिए यह आवश्यक होने तक डेटा दृश्य नहीं बनाता है), इसलिए यदि मैं ऐसा कुछ करता हूं:

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

तब मुझे एक वैध लेबल मिलता है, लेकिन numberOfLinesउस पर सेटिंग (और लाइनब्रीकमोड) काम नहीं करता है - मुझे अभी भी सिंगल लाइन टेक्स्ट मिलता है। UILabelप्रदर्शित करने के लिए पाठ के लिए बहुत ऊँचाई है - मैं ऊँचाई के लिए एक बड़ा मान लौटा रहा हूँ heightForRowAtIndexPath

जवाबों:


277

यहाँ एक सरल तरीका है, और यह मेरे लिए काम करता है:

अपने cellForRowAtIndexPath:कार्य के अंदर । पहली बार जब आप अपना सेल बनाते हैं:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

आप देखेंगे कि मैंने लेबल के लिए लाइनों की संख्या 0. पर सेट कर दी है। यह इसे उतनी ही लाइनों का उपयोग करने देता है जितनी ज़रूरत है।

अगला भाग यह निर्दिष्ट UITableViewCellकरना है कि आपका कितना बड़ा होगा, इसलिए अपने heightForRowAtIndexPathकार्य में यह करें :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

मैंने अपनी लौटाई गई सेल ऊंचाई को 20 जोड़ दिया क्योंकि मुझे अपने पाठ के चारों ओर थोड़ा बफर पसंद है।


17
आपको कुछ मनमाने ढंग से उच्च संख्या में अपने सेल.टेक्स्ट लैबल.नंबरऑफलाइन को सेट करने की आवश्यकता नहीं है। इसे 0 पर सेट करने का अर्थ है "जितनी रेखाओं को प्रदर्शित करना है।"
mmc

धन्यवाद, मैं अपनी पोस्ट को आज रात संपादित करूँगा, क्योंकि मुझे अपनी परियोजना में इसे सत्यापित करने का मौका मिलेगा।
टिम रूपे

1
लाइनों की संख्या को 0 पर सेट करना ठीक काम करता है (जितनी रेखाएँ प्रदर्शित होती हैं)
प्रकाश

1
cagreen: यह बताता है कि मैं इसे दोहरा सकता हूं, लेकिन केवल अगर मैं सिम्युलेटर में iPhone OS 3.0 का उपयोग करता हूं। जब मैं 3.1+ का उपयोग करता हूं, तो detailTextLabel का आकार बदलने वाले आकार से मेल खाता है। तो टिम की विधि वास्तव में अच्छी तरह से काम करती है - सिर्फ 3.1+ के लिए (संभवतः 3.0 डिफ़ॉल्ट सेल रेंडरिंग में बग / मिसफिट्योर के कारण)। रिकॉर्ड के लिए, मैं 12 (प्रत्येक) के वर्टिकल टॉप / बॉटम मार्जिन (प्रत्येक) का उपयोग कर रहा हूं, (188.0, CGFLOAT_MAX) का एक डिटेल टेक्स्ट लेबल साइज़, और एक बोल्डसिस्टमफोंटऑफसाइज 15.
जो डी 'एंड्रिया

17
UILineBreakModeWordWrap को iOS 6 में चित्रित किया गया है। इसके बजाय NSLineBreakByWordWrap का उपयोग करें।
एथन एलन

16

IOS7 के लिए अपडेटेड टिम रुपे का जवाब:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];

    NSAttributedString *attributedText =
        [[NSAttributedString alloc]
            initWithString:cellText
            attributes:@
            {
                NSFontAttributeName: cellFont
            }];
    CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height + 20;
}

3

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

और मेरे पास NIB फ़ाइल के अंदर पाठ लपेटने के लिए नहीं, और लेबल के लिए केवल 1 पंक्ति है; NIB फ़ाइल सेटिंग्स उन सेटिंग्स को ओवरराइड कर रही थीं जिन्हें मैंने कोड के अंदर समायोजित किया था।

मैंने जो सबक लिया वह यह सुनिश्चित करने के लिए हमेशा ध्यान में रखना था कि वस्तुओं की स्थिति प्रत्येक बिंदु पर क्या है - वे अभी तक नहीं बनाए गए हैं! ... किसी ने लाइन से नीचे उतारा।


2

अगर हमें UITableViewसेल में केवल पाठ जोड़ना है , तो हमें काम करने के लिए केवल दो प्रतिनिधियों की आवश्यकता है (अतिरिक्त जोड़ने की कोई आवश्यकता नहीं है UILabels)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

इस समाधान ने मेरे लिए काम किया: -

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;

    [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 
    cell.textLabel.text = [mutArr objectAtIndex:indexPath.section];
    NSLog(@"%@",cell.textLabel.text);

    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]];

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    CGSize labelSize = CGSizeMake(200.0, 20.0);

    NSString *strTemp = [mutArr objectAtIndex:indexPath.section];

    if ([strTemp length] > 0)
        labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap];

    return (labelSize.height + 10);
}

यहाँ स्ट्रिंग mutArrएक उत्परिवर्तित सारणी है जिससे मैं अपना डेटा प्राप्त कर रहा हूँ।

EDIT: - यहाँ वह ऐरे है जो मैंने लिया था।

mutArr= [[NSMutableArray alloc] init];

[mutArr addObject:@"HEMAN"];
[mutArr addObject:@"SUPERMAN"];
[mutArr addObject:@"Is SUPERMAN powerful than HEMAN"];
[mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"];
[mutArr addObject:@"Where are BATMAN and SPIDERMAN"];

2

अब टेबलव्यू में सेल्फ-साइजिंग सेल हो सकते हैं। तालिका दृश्य निम्नानुसार सेट करें

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

Apple संदर्भ


0

मैं निम्नलिखित समाधान का उपयोग करता हूं।

सदस्य में डेटा अलग से दिया गया है:

-(NSString *)getHeaderData:(int)theSection {
    ...
    return rowText;
}

इसमें हैंडलिंग आसानी से की जा सकती है cellForRowAtIndexPath। सेल को परिभाषित करें / फ़ॉन्ट परिभाषित करें और इन मानों को परिणाम "सेल" पर असाइन करें। ध्यान दें कि numberoflines"0" पर सेट किया गया है, जिसका अर्थ है कि वह लें जो आवश्यक है।

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    cell.textLabel.text= [self getRowData:indexPath.section];
    cell.textLabel.font = cellFont;
    cell.textLabel.numberOfLines=0;
    return cell;
}

में heightForRowAtIndexPath, मैं लिपटे पाठ की ऊंचाइयों की गणना करता हूं। कोडिंग का आकार आपके सेल की चौड़ाई से संबंधित होगा। IPad के लिए यह 1024 होगा। iPhone en iPod 320 के लिए।

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX);
    CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap];
    return requiredSize.height;    
}

0

मैंने पाया कि यह काफी सरल और सीधा है:

[self.tableView setRowHeight:whatEvereight.0f];

उदाहरण के लिए:

[self.tableView setRowHeight:80.0f];

ऐसा करने के लिए यह सबसे अच्छा / मानक दृष्टिकोण हो सकता है या नहीं, लेकिन यह मेरे मामले में काम करता है।


जैसा कि मैं इसे समझता हूं, रोहाइट प्रॉपर्टी एक निश्चित ऊंचाई निर्धारित करती है जिसका उपयोग तालिका दृश्य में सभी कोशिकाओं के लिए किया जाएगा। बड़ी तालिकाओं में प्रदर्शन के लिए rowHeight का उपयोग करना बेहतर होता है, लेकिन अगर आपको इसकी सामग्री के आधार पर भिन्न होने के लिए प्रत्येक सेल की ऊंचाई की आवश्यकता होती है, तो यह tableView लगता है: heightForRowAtIndexPath: विधि का उपयोग किया जाना है।
jk7

0

मेरा कोड स्विफ्ट में आज़माएं। यह कोड सामान्य UILabels के लिए भी काम करेगा।

extension UILabel {
    func lblFunction() {
        //You can pass here all UILabel properties like Font, colour etc....
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

अब ऐसे ही कॉल करें

cell.textLabel.lblFunction()//Replace your label name 

-1

मुझे लगता है कि यह एक बेहतर और छोटा उपाय है। बस सेल का प्रारूप UILabel( textLabelए) निर्दिष्ट करके ऊंचाई के लिए ऑटो की गणना करें sizeToFitऔर सब कुछ ठीक होना चाहिए।

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text = @"Whatever text you want to put here is ok";
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    [cell.textLabel sizeToFit];

    return cell;
}

-2

मुझे नहीं लगता कि आप ऐसा करने के लिए एक आधार UITableViewCell'sनिजी हेरफेर कर सकते हैं UILabel। आप एक नया जोड़ सकता है UILabelसेल करने के लिए अपने आप को और उपयोग करने numberOfLinesके साथ sizeToFitयह उचित रूप से आकार करने के लिए। कुछ इस तरह:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame];
label.numberOfLines = <...an appriate number of lines...>
label.text = <...your text...>
[label sizeToFit];
[cell addSubview:label];
[label release];
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.