Einstellen von benutzerdefinierter UITableViewCells Höhe

stimmen
209

Ich verwende eine benutzerdefinierte UITableViewCell , die einige Etiketten hat, Schaltflächen und Bildansichten angezeigt werden. Es ist ein Etikett in der Zelle , deren Text ein NSStringObjekt und die Länge der String - Variable sein könnte. Aus diesem Grunde kann ich nicht eine konstante Höhe auf die Zelle in der festgelegt UITableViewist heightForCellAtIndexMethode. Die Höhe der Zelle hängt von der Höhe des Etiketts , die das bestimmt werden kann , unter Verwendung von NSStrings - sizeWithFontMethode. Ich habe versucht , es zu benutzen, aber es sieht aus wie ich irgendwo falsch gehe. Wie kann es behoben werden?

Hier ist der Code für die Initialisierung der Zelle verwendet.

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

Dies ist die Bezeichnung, deren Höhe und Breite geht falsch:

textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
Veröffentlicht am 30/01/2009 um 06:27
quelle vom benutzer
In anderen Sprachen...                            


9 antworten

stimmen
483

Ihr UITableViewDelegatesollte implementierentableView:heightForRowAtIndexPath:

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

Sie wollen wahrscheinlich verwenden NSString‚s sizeWithFont:constrainedToSize:lineBreakMode:Methode , um Ihre Zeilenhöhe zu berechnen , anstatt nur auf dem indexPath einige dumme Mathe Durchführung :)

Beantwortet am 30/01/2009 um 23:46
quelle vom benutzer

stimmen
121

Wenn alle Zeilen die gleiche Höhe haben, setzen Sie einfach die rowHeightEigenschaft des UITableView anstatt die Umsetzung heightForRowAtIndexPath. Apple - Docs:

Es gibt Auswirkungen auf die Leistung zu verwenden Tableview: heightForRowAtIndexPath: statt rowHeight. Jedes Mal, wenn eine Tabellenansicht angezeigt wird, ruft es Tableview: heightForRowAtIndexPath: auf dem Delegierten für jede ihrer Zeilen, die in einer signifikanten Performance-Problem mit Tabellenansichten, die eine große Anzahl von Zeilen (etwa 1000 oder mehr) führen kann.

Beantwortet am 19/01/2011 um 00:59
quelle vom benutzer

stimmen
22

in einem benutzerdefinierten UITableViewCell -Controller dieses Add

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

Im UITableView -Controller dieses Add

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [indexPath row] * 1.5; // your dynamic height...
}
Beantwortet am 19/01/2010 um 14:26
quelle vom benutzer

stimmen
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;
}
Beantwortet am 19/09/2012 um 10:30
quelle vom benutzer

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

}
Beantwortet am 18/11/2012 um 17:20
quelle vom benutzer

stimmen
5

Ich sah viele Lösungen, aber alles war falsch oder uncomplet. Sie können alle Probleme mit 5 Zeilen in viewDidLoad und automatischen Layout lösen. Diese für objetive C:

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

Für die schnellen 2.0:

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

Jetzt ist Ihre Zelle mit xib erstellen oder in Tableview in Ihrem Storyboard Damit Sie keine Notwendigkeit implementieren nichts mehr oder außer Kraft setzen. (Don vergessen Anzahl os Zeilen 0) und die untere Etikett (constrain) herabzustufen "Content Hugging Priorität - Vertikale bis 250"

Geben Sie hier image description Geben Sie hier image description

Sie können den Code in dem nächsten url donwload: https://github.com/jposes22/exampleTableCellCustomHeight

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

Beantwortet am 26/01/2016 um 19:58
quelle vom benutzer

stimmen
5

Vielen Dank an alle Beiträge zu diesem Thema gibt es einige wirklich hilfreiche Möglichkeiten, die rowHeight eines UITableViewCell einzustellen.

Hier ist eine Zusammenstellung von einigen der Konzepte von allen anderen, die wirklich hilft, wenn für das iPhone und iPad zu bauen. Sie können auch verschiedene Abschnitte zugreifen und passen sie entsprechend den unterschiedlichen Größen der Ansichten.

- (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;
} 
Beantwortet am 22/03/2012 um 21:02
quelle vom benutzer

stimmen
3

Um die dynamische Zellenhöhe wie der Text von Label erhöht haben, müssen Sie zuerst Höhe berechnen, dass der Text Gonna Verwendung in -heightForRowAtIndexPathDelegatmethode und senden Sie es mit den zusätzlichen Höhen anderer lables, Bilder (max Höhe des Textes + Höhe anderen statischen componenets) und Verwendung derselben Höhe in Zell Schöpfung.

#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;
}
Beantwortet am 01/08/2012 um 12:07
quelle vom benutzer

stimmen
2

So stellen Sie die automatische Dimension für die Zeilenhöhe und geschätzte Zeilenhöhe sorgt wie folgt zu machen, Auto Dimension wirksam für Zelle / Zeilenhöhe Layout.

  • Vergeben und Tableview Datasource implementieren und delegieren
  • Weisen Sie UITableViewAutomaticDimensionauf rowHeight & estimatedRowHeight
  • Implementieren delegieren / datasource Methoden (dh heightForRowAtund gibt einen Wert zurück , UITableViewAutomaticDimensionum es)

-

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

Schnell:

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

Für Etiketten Beispiel in UITableViewCell

  • Legen Sie die Anzahl der Zeilen = 0 (& Zeilenumbruch mode = gestutzt Schwanz)
  • Stellen Sie alle Zwänge (oben, unten, links) in Bezug auf seine Super / Zellenbehälter.
  • Optional : Festlegen der Mindesthöhe für Etikett, wenn Sie vertikale Mindestfläche von Etikett abgedeckt wollen, auch wenn es keine Daten gibt.

Geben Sie hier image description

Hinweis : Wenn Sie mehr als eine Etiketten haben (UIElements) mit dynamischer Länge, die nach ihrem Inhalt Größe angepasst werden sollten: Stellen Sie ‚Content Hugging und Kompressionswiderstand Priority` für Etiketten , die Sie erweitern möchten / komprimieren mit höherer Priorität.

Hier in diesem Beispiel stelle ich niedrigen umarmen und hohe Druckfestigkeit Priorität, die mehr Priorität / Bedeutung für die Inhalte der zweiten (gelb) Etikett zu setzen führt.

Geben Sie hier image description

Beantwortet am 02/02/2018 um 15:20
quelle vom benutzer

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