स्थापना कस्टम UITableViewCells ऊंचाई

वोट
209

मैं उपयोग कर रहा हूँ एक कस्टम UITableViewCell जो कुछ लेबल, बटन और छवि का नजारा दिखता है प्रदर्शित करने के लिए। वहाँ सेल जिसका पाठ एक है में एक लेबल है NSStringवस्तु और स्ट्रिंग की लंबाई चर हो सकता है। इस के कारण, मैं में सेल करने के लिए एक निरंतर ऊंचाई निर्धारित नहीं कर सकते UITableViewकी heightForCellAtIndexविधि। सेल की ऊंचाई लेबल की ऊंचाई जो का उपयोग कर निर्धारित किया जा सकता पर निर्भर करता है NSStringकी sizeWithFontविधि। मैं इसे उपयोग करने की कोशिश, लेकिन ऐसा लगता है मैं गलत कहीं जा रहा हूँ। इसका समाधान कैसे किया जा सकता है?

यहाँ सेल आरंभ के लिए इस्तेमाल किया कोड है।

if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier])
{
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    UIImage *image = [UIImage imageNamed:@dot.png];
    imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = CGRectMake(45.0,10.0,10,10);

    headingTxt = [[UILabel alloc] initWithFrame:   CGRectMake(60.0,0.0,150.0,post_hdg_ht)];
    [headingTxt setContentMode: UIViewContentModeCenter];
    headingTxt.text = postData.user_f_name;
    headingTxt.font = [UIFont boldSystemFontOfSize:13];
    headingTxt.textAlignment = UITextAlignmentLeft;
    headingTxt.textColor = [UIColor blackColor];

    dateTxt = [[UILabel alloc] initWithFrame:CGRectMake(55.0,23.0,150.0,post_date_ht)];
    dateTxt.text = postData.created_dtm;
    dateTxt.font = [UIFont italicSystemFontOfSize:11];
    dateTxt.textAlignment = UITextAlignmentLeft;
    dateTxt.textColor = [UIColor grayColor];

    NSString * text1 = postData.post_body;
    NSLog(@text length = %d,[text1 length]);
    CGRect bounds = [UIScreen mainScreen].bounds;
    CGFloat tableViewWidth;
    CGFloat width = 0;
    tableViewWidth = bounds.size.width/2;
    width = tableViewWidth - 40; //fudge factor
    //CGSize textSize = {width, 20000.0f}; //width and height of text area
    CGSize textSize = {245.0, 20000.0f}; //width and height of text area
    CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:11.0f]
                        constrainedToSize:textSize lineBreakMode:UILineBreakModeWordWrap];

    CGFloat ht = MAX(size1.height, 28);
    textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
    textView.text = postData.post_body;
    textView.font = [UIFont systemFontOfSize:11];
    textView.textAlignment = UITextAlignmentLeft;
    textView.textColor = [UIColor blackColor];
    textView.lineBreakMode = UILineBreakModeWordWrap;
    textView.numberOfLines = 3;
    textView.autoresizesSubviews = YES;

    [self.contentView addSubview:imageView];
    [self.contentView addSubview:textView];
    [self.contentView addSubview:webView];
    [self.contentView addSubview:dateTxt];
    [self.contentView addSubview:headingTxt];
    [self.contentView sizeToFit];

    [imageView release];
    [textView release];
    [webView release];
    [dateTxt release];
    [headingTxt release];
}

इस लेबल जिसका ऊंचाई और चौड़ाई गलत जा रहे हैं:

textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
30/01/2009 को 06:27
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


9 जवाब

वोट
483

आपका UITableViewDelegateलागू करना चाहिएtableView:heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [indexPath row] * 20;
}

आप शायद का उपयोग करना चाहते जाएगा NSStringकी sizeWithFont:constrainedToSize:lineBreakMode:बस indexPath पर कुछ मूर्खतापूर्ण गणित प्रदर्शन की अपेक्षा अपनी पंक्ति की ऊँचाई गणना करने के लिए विधि :)

30/01/2009 को 23:46
का स्रोत उपयोगकर्ता

वोट
121

अपने सभी पंक्तियों में एक ही ऊंचाई हैं, तो बस सेट rowHeightको लागू करने के बजाय UITableView की संपत्ति heightForRowAtIndexPath। एप्पल डॉक्स:

heightForRowAtIndexPath: rowHeight के बजाय वहाँ tableView उपयोग करने के लिए प्रदर्शन निहितार्थ हैं। हर बार जब एक तालिका दृश्य प्रदर्शित किया जाता है, यह कहता है tableView: heightForRowAtIndexPath: अपनी पंक्तियों में से प्रत्येक के लिए प्रतिनिधि है, जो मेज विचारों पंक्तियों (लगभग 1000 या अधिक) की एक बड़ी संख्या होने के साथ एक महत्वपूर्ण प्रदर्शन समस्या हो सकती है पर।

19/01/2011 को 00:59
का स्रोत उपयोगकर्ता

वोट
22

एक कस्टम में UITableViewCell इस ऐड -controller

-(void)layoutSubviews {  

    CGRect newCellSubViewsFrame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
    CGRect newCellViewFrame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height);

    self.contentView.frame = self.contentView.bounds = self.backgroundView.frame = self.accessoryView.frame = newCellSubViewsFrame;
    self.frame = newCellViewFrame;

    [super layoutSubviews];
}

UITableView में इस ऐड -controller

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [indexPath row] * 1.5; // your dynamic height...
}
19/01/2010 को 14:26
का स्रोत उपयोगकर्ता

वोट
17
#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 300.0f
#define CELL_CONTENT_MARGIN 10.0f

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath      *)indexPath;
{
   /// Here you can set also height according to your section and row
   if(indexPath.section==0 && indexPath.row==0)
   {
     text=@"pass here your dynamic data";

     CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

     CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE]      constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

     CGFloat height = MAX(size.height, 44.0f);

     return height + (CELL_CONTENT_MARGIN * 2);
   }
   else
   {
      return 44;
   }
}

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    UILabel *label = nil;

    cell = [tv dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil)
    {
       cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"];
    }
    ********Here you can set also height according to your section and row*********
    if(indexPath.section==0 && indexPath.row==0)
    {
        label = [[UILabel alloc] initWithFrame:CGRectZero];
        [label setLineBreakMode:UILineBreakModeWordWrap];
        [label setMinimumFontSize:FONT_SIZE];
        [label setNumberOfLines:0];
        label.backgroundColor=[UIColor clearColor];
        [label setFont:[UIFont systemFontOfSize:FONT_SIZE]];
        [label setTag:1];

        // NSString *text1 =[NSString stringWithFormat:@"%@",text];

        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

        if (!label)
        label = (UILabel*)[cell viewWithTag:1];


        label.text=[NSString stringWithFormat:@"%@",text];
        [label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH          - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];
        [cell.contentView addSubview:label];
    }
return cell;
}
19/09/2012 को 10:30
का स्रोत उपयोगकर्ता

वोट
8
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    CGSize constraintSize = {245.0, 20000}
    CGSize neededSize = [ yourText sizeWithFont:[UIfont systemFontOfSize:14.0f] constrainedToSize:constraintSize  lineBreakMode:UILineBreakModeCharacterWrap]
if ( neededSize.height <= 18) 

   return 45
else return neededSize.height + 45 
//18 is the size of your text with the requested font (systemFontOfSize 14). if you change fonts you have a different number to use  
// 45 is what is required to have a nice cell as the neededSize.height is the "text"'s height only
//not the cell.

}
18/11/2012 को 17:20
का स्रोत उपयोगकर्ता

वोट
5

मैं समाधान का एक बहुत देखा था, लेकिन सब गलत या uncomplet था। आप viewDidLoad और autolayout में 5 लाइनों के साथ सभी समस्याओं का समाधान कर सकते हैं। objetive सी के लिए यह:

_tableView.delegate = self;
_tableView.dataSource = self;
self.tableView.estimatedRowHeight = 80;//the estimatedRowHeight but if is more this autoincremented with autolayout
self.tableView.rowHeight = UITableViewAutomaticDimension;
[self.tableView setNeedsLayout];
[self.tableView layoutIfNeeded];
self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0) ;

तेजी से 2.0 के लिए:

 self.tableView.estimatedRowHeight = 80
 self.tableView.rowHeight = UITableViewAutomaticDimension      
 self.tableView.setNeedsLayout()
 self.tableView.layoutIfNeeded()
 self.tableView.contentInset = UIEdgeInsetsMake(20, 0, 0, 0)

अब इस के साथ xib के साथ या अपने स्टोरीबोर्ड में tableview में अपने सेल बनाने आप कोई जरूरत ज्यादा कुछ नहीं लागू करने या ओवरराइड। और नीचे लेबल (विवश) (डॉन नंबर ओएस लाइनों 0 भूलना) डाउनग्रेड "सामग्री गले लगाना प्राथमिकता - 250 लंबवत"

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

आप अगले यूआरएल में कोड donwload कर सकते हैं: https://github.com/jposes22/exampleTableCellCustomHeight

संदर्भ: http://candycode.io/automatically-resizing-uitableviewcells-with-dynamic-text-height-using-auto-layout/

26/01/2016 को 19:58
का स्रोत उपयोगकर्ता

वोट
5

इस विषय पर सभी पोस्ट के लिए धन्यवाद, वहाँ एक UITableViewCell की rowHeight समायोजित करने के लिए वास्तव में कुछ उपयोगी तरीके हैं।

यहाँ हर कोई जब iPhone और iPad के निर्माण में मदद करता है कि वास्तव में से अवधारणाओं में से कुछ का एक संकलन है। तुम भी विभिन्न वर्गों के लिए उपयोग और विचारों के विभिन्न आकार के अनुसार उन्हें समायोजित कर सकते हैं।

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

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    int cellHeight = 0;

    if ([indexPath section] == 0) 
    {
        cellHeight = 16;
        settingsTable.rowHeight = cellHeight;
    }
    else if ([indexPath section] == 1)
    {
        cellHeight = 20;
        settingsTable.rowHeight = cellHeight;
    }

    return cellHeight;
}
else
{
    int cellHeight = 0;

    if ([indexPath section] == 0) 
    {
        cellHeight = 24;
        settingsTable.rowHeight = cellHeight;
    }
    else if ([indexPath section] == 1)
    {
        cellHeight = 40;
        settingsTable.rowHeight = cellHeight;
    }

    return cellHeight;
}
return 0;
} 
22/03/2012 को 21:02
का स्रोत उपयोगकर्ता

वोट
3

लेबल बढ़ जाती है की पाठ के रूप में गतिशील सेल ऊंचाई करवाने के लिए, आप पहली बार है, ऊंचाई की गणना करनी है कि में पाठ करने वाले उपयोग -heightForRowAtIndexPathप्रतिनिधि विधि और अन्य lables, छवियों का जोड़ा ऊंचाइयों के साथ इसे वापस (पाठ + अन्य स्थिर की ऊंचाई की अधिकतम ऊंचाई componenets) और सेल के निर्माण में एक ही ऊंचाई का उपयोग करें।

#define FONT_SIZE 14.0f
#define CELL_CONTENT_WIDTH 300.0f  
#define CELL_CONTENT_MARGIN 10.0f

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

    if (indexPath.row == 2) {  // the cell you want to be dynamic

        NSString *text = dynamic text for your label;

        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

        CGFloat height = MAX(size.height, 44.0f);

        return height + (CELL_CONTENT_MARGIN * 2);
    }
    else {
        return 44; // return normal cell height
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UILabel *label;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

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

    label = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, 280, 34)];

    [label setNumberOfLines:2];

    label.backgroundColor = [UIColor clearColor];

    [label setFont:[UIFont systemFontOfSize:FONT_SIZE]];

    label.adjustsFontSizeToFitWidth = NO;

    [[cell contentView] addSubview:label];


    NSString *text = dynamic text fro your label;

    [label setText:text];

    if (indexPath.row == 2) {// the cell which needs to be dynamic 

        [label setNumberOfLines:0];

        CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);

        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];

        [label setFrame:CGRectMake(CELL_CONTENT_MARGIN, CELL_CONTENT_MARGIN, CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), MAX(size.height, 44.0f))];

    }
    return  cell;
}
01/08/2012 को 12:07
का स्रोत उपयोगकर्ता

वोट
2

पंक्ति की ऊँचाई और अनुमान पंक्ति की ऊँचाई के लिए स्वत: आयाम सेट करने के लिए सेल / पंक्ति की ऊँचाई लेआउट के लिए प्रभावी निम्नलिखित बनाने के लिए कदम, ऑटो आयाम करता है।

  • असाइन करें और tableview डेटा स्रोत को लागू करने और सौंपने
  • निरुपित UITableViewAutomaticDimensionrowHeight और estimatedRowHeight को
  • प्रतिनिधि / डेटा स्रोत के तरीकों को लागू करें (यानी heightForRowAtऔर कोई मान UITableViewAutomaticDimensionइसे करने के लिए)

-

उद्देश्य सी:

// in ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

  @property IBOutlet UITableView * table;

@end

// in ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    self.table.dataSource = self;
    self.table.delegate = self;

    self.table.rowHeight = UITableViewAutomaticDimension;
    self.table.estimatedRowHeight = UITableViewAutomaticDimension;
}

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

    return UITableViewAutomaticDimension;
}

स्विफ्ट:

@IBOutlet weak var table: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Don't forget to set dataSource and delegate for table
    table.dataSource = self
    table.delegate = self

    // Set automatic dimensions for row height
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension
}



// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

UITableViewCell में लेबल उदाहरण के लिए

  • लाइनों = 0 की संख्या सेट करें (और लाइन ब्रेक मोड = काटना पूंछ)
  • इसके superview / सेल कंटेनर के संबंध में सभी बाधाओं (ऊपर, नीचे, सही बाएं) सेट करें।
  • वैकल्पिक :, लेबल के लिए न्यूनतम ऊंचाई सेट करता है, तो आप लेबल के अंतर्गत आने वाले कम से कम ऊर्ध्वाधर क्षेत्र चाहते हैं, भले ही कोई डाटा नहीं है वहाँ।

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

नोट : यदि आप गतिशील लंबाई है, जो अपनी सामग्री आकार के अनुसार समायोजित किया जाना चाहिए के साथ एक से अधिक लेबल (UIElements) कर दिया है तो: 'समायोजित सामग्री गले लगाना और लेबल जो आप विस्तार / उच्च प्राथमिकता के साथ संपीड़ित करने के लिए चाहते हैं के लिए संपीड़न प्रतिरोध Priority`।

यहां इस उदाहरण में मैं कम गले और उच्च संपीड़न प्रतिरोध प्राथमिकता, कि दूसरा (पीला) लेबल की सामग्री के लिए अधिक प्राथमिकता / महत्व स्थापित करने के लिए ले जाता है निर्धारित किया है।

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

02/02/2018 को 15:20
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more