Instellen van aangepaste UITableViewCells hoogte

stemmen
209

Ik gebruik een aangepaste UITableViewCell die sommige labels, knoppen en uitzicht afbeelding getoond moet worden. Er is een label in de cel waarvan de tekst een NSStringobject en het stuk touw kan variabel zijn. Hierdoor kan ik stel een constante hoogte voor de cel van de UITableViewjaren' heightForCellAtIndexmethode. Hoogte van de cel afhankelijk van het label hoogte die kan worden bepaald met de NSString's sizeWithFontmethode. Ik probeerde het gebruik ervan, maar het lijkt alsof ik ergens verkeerd gaan. Hoe kan het worden opgelost?

Hier is de code die wordt gebruikt voor het initialiseren van de cel.

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

Dit is het label waarvan de hoogte en de breedte over de scheef gaan:

textView = [[UILabel alloc] initWithFrame:CGRectMake(55.0,42.0,245.0,ht)];
De vraag is gesteld op 30/01/2009 om 06:27
bron van user
In andere talen...                            


9 antwoorden

stemmen
483

Je UITableViewDelegatemoet implementerentableView:heightForRowAtIndexPath:

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

U zult waarschijnlijk wilt gebruiken NSString's sizeWithFont:constrainedToSize:lineBreakMode:methode om uw rijhoogte te berekenen in plaats van alleen het uitvoeren van een domme wiskunde op de indexPath :)

antwoordde op 30/01/2009 om 23:46
bron van user

stemmen
121

Als al uw rijen dezelfde hoogte is, kan gewoon het rowHeighteigendom van de UITableView in plaats van de uitvoering van het heightForRowAtIndexPath. Apple Docs:

Er zijn prestaties implicaties voor het gebruik van tableView: heightForRowAtIndexPath: in plaats van rowHeight. Iedere keer dat een tabel weergave wordt getoond, roept tableView: heightForRowAtIndexPath: op de gemachtigde voor elk van de rijen, wat kan resulteren in een aanzienlijke prestatieverbeteringen probleem met uitzicht op tafel met een groot aantal rijen (ongeveer 1000 of meer).

antwoordde op 19/01/2011 om 00:59
bron van user

stemmen
22

in een aangepaste UITableViewCell -Controller deze 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];
}

In de UITableView -Controller deze add

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [indexPath row] * 1.5; // your dynamic height...
}
antwoordde op 19/01/2010 om 14:26
bron van user

stemmen
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;
}
antwoordde op 19/09/2012 om 10:30
bron van user

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

}
antwoordde op 18/11/2012 om 17:20
bron van user

stemmen
5

Ik zag veel oplossingen, maar alles was verkeerd of uncomplet. U kunt alle problemen met 5 lijnen in viewDidLoad en autolayout lossen. Dit voor 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) ;

Voor swift 2.0:

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

Maak nu je cel met xib of in Tableview in uw Storyboard Hiermee kunt geen behoefte te implementeren niets meer of overschrijven. (Don vergeet aantal os lijnen 0) en de onderste label (beperken) downgrade "Content Knuffelen Priority - Vertical tot 250"

voer image beschrijving hier voer image beschrijving hier

U kunt de code in de volgende url donwload: https://github.com/jposes22/exampleTableCellCustomHeight

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

antwoordde op 26/01/2016 om 19:58
bron van user

stemmen
5

Dank aan alle berichten over dit onderwerp, zijn er een aantal echt nuttig manieren om de rowHeight van een UITableViewCell aan te passen.

Hier is een compilatie van een aantal van de concepten van iedereen anders dat echt helpt bij het bouwen voor de iPhone en iPad. U kunt ook toegang krijgen tot verschillende secties en stel ze in overeenstemming met de verschillende afmetingen van standpunten.

- (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;
} 
antwoordde op 22/03/2012 om 21:02
bron van user

stemmen
3

Om de dynamische cel hoogte als de tekst van Label toeneemt, moet u eerst om de hoogte te berekenen, dat de tekst gaat gebruiken in -heightForRowAtIndexPathdelegeren methode en terug te sturen met de toegevoegde hoogten van andere labels, beelden (max hoogte van tekst + hoogte van andere statische componenets) en gebruik dezelfde hoogte in cel schepping.

#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;
}
antwoordde op 01/08/2012 om 12:07
bron van user

stemmen
2

Om de automatische dimensie rijhoogte & geschat rijhoogte vastleggen, voor volgende stappen te maken, auto dimensie effectief voor cel / rijhoogte lay-out.

  • Wijs en implementeren van Tableview dataSource en delegeren
  • Wijs UITableViewAutomaticDimensionnaar rowHeight & estimatedRowHeight
  • Uitvoering delegeren / dataSource methoden (dwz heightForRowAten een waarde terug UITableViewAutomaticDimensionte)

-

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

Snel:

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

Voor label bijvoorbeeld in UITableViewCell

  • Set aantal regels = 0 (& regeleinde mode = afkappen staart)
  • Stel alle beperkingen (boven, onder, rechts links) met betrekking tot zijn superview / celhouder.
  • Optioneel : Minimale hoogte instellen voor label, als u minimum verticale gebied dat onder label wilt, zelfs als er geen gegevens zijn.

voer image beschrijving hier

Opmerking : Als u meer dan één labels (UIElements) met dynamische lengte, die moet worden aangepast aan de inhoud ervan grootte hebt: Stel 'Content Knuffelen en drukweerstand Priority` voor labels die u wilt uitbreiden / comprimeren met een hogere prioriteit.

Hier in het voorbeeld I lage koesteren en hoge compressieweerstand prioriteit, die leidt tot hogere prioriteit / belangrijk bij gehalten tweede (geel) label ingesteld.

voer image beschrijving hier

antwoordde op 02/02/2018 om 15:20
bron van user

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