Setarea personalizată UITableViewCells înălțime

voturi
209

Sunt folosind un obicei UITableViewCell care are unele etichete, butoane și vizualizarea imaginii pentru a fi afișate. Există o etichetă în celulă al cărei text este un NSStringobiect și lungimea șirului poate fi variabilă. Datorită acestui fapt, eu nu pot seta o înălțime constantă a celulei în UITableViewe heightForCellAtIndexmetoda. Înălțimea celulei depinde de înălțimea etichetei , care poate fi determinată cu ajutorul NSStringlui sizeWithFontmetoda. Am încercat , folosind - o, dar se pare ca am de gând greșit undeva. Cum poate fi fixat?

Aici este codul utilizat pentru inițializarea celulei.

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];
}

Aceasta este eticheta a cărei înălțime și lățime merg greșit:

textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
Întrebat 30/01/2009 la 06:27
sursa de către utilizator
În alte limbi...                            


9 răspunsuri

voturi
483

Dvs. UITableViewDelegatear trebui să pună în aplicaretableView:heightForRowAtIndexPath:

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

Veți dori , probabil , să utilizeze NSStringe sizeWithFont:constrainedToSize:lineBreakMode:metoda pentru a calcula înălțimea dumneavoastră rând , mai degrabă decât doar realizarea unor matematica stupide pe indexPath :)

Publicat 30/01/2009 la 23:46
sursa de către utilizator

voturi
121

Dacă toate rândurile sunt aceeași înălțime, trebuie doar să setați rowHeightproprietatea UITableView , mai degrabă decât punerea în aplicare a heightForRowAtIndexPath. Apple a Documente:

Există implicații de performanță pentru utilizarea tableView: heightForRowAtIndexPath: în loc de rowHeight. De fiecare dată când este afișată o vizualizare tabel, se numește tableView: heightForRowAtIndexPath: pe delegatul pentru fiecare din rândurile sale, ceea ce poate duce la o problemă semnificativă de performanță, cu vederi de masă având un număr mare de rânduri (aproximativ 1000 sau mai mult).

Publicat 19/01/2011 la 00:59
sursa de către utilizator

voturi
22

într-un obicei UITableViewCell -controller adăuga acest

-(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];
}

În UITableView -controller adăuga acest

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [indexPath row] * 1.5; // your dynamic height...
}
Publicat 19/01/2010 la 14:26
sursa de către utilizator

voturi
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;
}
Publicat 19/09/2012 la 10:30
sursa de către utilizator

voturi
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.

}
Publicat 18/11/2012 la 17:20
sursa de către utilizator

voturi
5

Am văzut o mulțime de soluții, dar totul a fost greșit sau uncomplet. Puteți rezolva toate problemele cu 5 linii în viewDidLoad și autolayout. Aceasta pentru C obiectivul planului:

_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) ;

Pentru rapidă 2.0:

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

Acum creați celula cu XIb sau în tableview în Storyboard dvs. Cu acest lucru nu este nevoie să pună în aplicare nimic mai mult sau suprascrie. (Nu uitați numărul de linii de os 0) și eticheta de fund (constrânge) downgrade „Conținut îmbrățișarea Prioritate - Vertical la 250“

introduceți descrierea imaginii aici introduceți descrierea imaginii aici

Puteți donwload codul în următorul URL: https://github.com/jposes22/exampleTableCellCustomHeight

Referințe: http://candycode.io/automatically-resizing-uitableviewcells-with-dynamic-text-height-using-auto-layout/

Publicat 26/01/2016 la 19:58
sursa de către utilizator

voturi
5

Datorită toate postările de pe acest subiect, există unele moduri foarte utile pentru a regla rowHeight unui UITableViewCell.

Aici este o compilație a unora dintre conceptele de oricine altcineva care ajută cu adevărat atunci când construirea pentru iPhone și iPad. Puteți accesa, de asemenea, secțiuni diferite și să le adapteze în funcție de dimensiuni diferite de opinii.

- (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;
} 
Publicat 22/03/2012 la 21:02
sursa de către utilizator

voturi
3

Pentru a avea înălțimea celulei dinamice ca textul crește Label, trebuie mai întâi să calculeze înălțimea, că textul va folosi în -heightForRowAtIndexPathmetoda delegat și se întoarce cu înălțimile adăugate ale altor privind etichetele, imagini (inaltime maxima de text + înălțimea altor statice componenets) și de a folosi aceeași înălțime în crearea de celule.

#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;
}
Publicat 01/08/2012 la 12:07
sursa de către utilizator

voturi
2

Pentru a seta dimensiunea automată pentru înălțimea rândului și înălțimea estimată rând, asigură următorii pași pentru a face, dimensiunea efectivă automată pentru layout înălțime de celule / rând.

  • Atribuirea și punerea în aplicare și tableview DATASOURCE delega
  • Atribuirea UITableViewAutomaticDimensionla rowHeight & estimatedRowHeight
  • Punerea în aplicare a delegat / metode DATASOURCE (adică heightForRowAtși returnează o valoare UITableViewAutomaticDimensionpentru ea)

-

Obiectiv C:

// 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;
}

Rapid:

@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
}

De exemplu, în eticheta UITableviewCell

  • Setați numărul de linii = 0 (& line modul break = trunchia coada)
  • Setați toate constrângerile (sus, jos, dreapta stânga) în ceea ce privește recipientul său Superview / celulă.
  • Opțional : Setați înălțimea minimă pentru etichetă, dacă doriți zona verticală minimă acoperită de etichetă, chiar dacă nu există date.

introduceți descrierea imaginii aici

Notă : Dacă ați mai mult de un etichete (UIElements) cu o lungime dinamică, care ar trebui să fie ajustată în funcție de dimensiunea de conținut: Ajustarea „îmbrățișând de conținut și de rezistenta la compresiune Priority` pentru etichete pe care doriți să se extindă / comprima cu prioritate mai mare.

Aici, în acest exemplu, am stabilit îmbrățișând scăzută și cu prioritate de rezistență ridicată la compresiune, care duce să stabilească o prioritate mai mare / importanță pentru conținutul doilea (galben) eticheta.

introduceți descrierea imaginii aici

Publicat 02/02/2018 la 15:20
sursa de către utilizator

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