Ρύθμιση προσαρμοσμένων UITableViewCells ύψος

ψήφοι
209

Είμαι χρησιμοποιώντας ένα έθιμο UITableViewCell που έχει κάποιες ετικέτες, κουμπιά και απόψεις εικόνα που θα εμφανίζεται. Υπάρχει μία ετικέτα στο κύτταρο του οποίου το κείμενο είναι ένα NSStringαντικείμενο και το μήκος της συμβολοσειράς θα μπορούσε να είναι μεταβλητή. Λόγω αυτού, δεν μπορώ να ορίσετε ένα σταθερό ύψος στο κελί του UITableView«s heightForCellAtIndexμέθοδο. Το ύψος του κυττάρου εξαρτάται από το ύψος της ετικέτας η οποία μπορεί να προσδιοριστεί με τη χρήση της NSString«s 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«s sizeWithFont:constrainedToSize:lineBreakMode:μέθοδο για τον υπολογισμό του ύψους γραμμής σας και όχι μόνο εκτελεί κάποια ανόητη μαθηματικά στο indexPath :)

Απαντήθηκε 30/01/2009 στις 23:46
πηγή χρήστη

ψήφοι
121

Αν όλες οι γραμμές σας είναι το ίδιο ύψος, μόλις την rowHeightιδιότητα του UITableView παρά την εφαρμογή του heightForRowAtIndexPath. Έγγραφα της Apple:

Υπάρχουν επιπτώσεις απόδοσης για τη χρήση TableView: heightForRowAtIndexPath: αντί rowHeight. Κάθε φορά που εμφανίζεται μια προβολή πίνακα, καλεί 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. Μπορείτε να λύσει όλα τα προβλήματα με 5 γραμμές σε viewDidLoad και αυτόματης διάταξης. Αυτό για 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) ;

Για ταχεία 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 στο Storyboard σας με αυτό που δεν χρειάζεται να εφαρμόσουν τίποτα περισσότερο ή να την παρακάμψουν. (Μην ξεχάσετε γραμμές os αριθμό 0) και το κάτω μέρος ετικέτα (περιορίζουν) υποβαθμίσει «Περιεχόμενο που αγκαλιάζει Προτεραιότητα - Κάθετη 250»

εισάγετε περιγραφή της εικόνας εδώ εισάγετε περιγραφή της εικόνας εδώ

Μπορείτε να donwload τον κωδικό στο επόμενο url: https://github.com/jposes22/exampleTableCellCustomHeight

Αναφορές: http://candycode.io/automatically-resizing-uitableviewcells-with-dynamic-text-height-using-auto-layout/

Απαντήθηκε 26/01/2016 στις 19:58
πηγή χρήστη

ψήφοι
5

Χάρη σε όλες τις δημοσιεύσεις σχετικά με το θέμα αυτό, υπάρχουν κάποια πραγματικά χρήσιμες τρόπους για να προσαρμόσετε την rowHeight ενός UITableViewCell.

Εδώ είναι μια συλλογή από μερικές από τις έννοιες από όλους τους άλλους που βοηθά πραγματικά κατά την κατασκευή για το 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

Για να έχουν τη δυναμική ύψος κελί ως κείμενο των αυξήσεων Label, θα πρέπει πρώτα να υπολογίσει το ύψος, το κείμενο θα το χρήση σε -heightForRowAtIndexPathμέθοδο εκπρόσωπος και να επιστρέψει με τα πρόσθετα ύψη των άλλων ετικέτες, πινακίδες, εικόνες (μέγιστο ύψος του κειμένου + ύψος των στατικών τις ενότητες) και χρησιμοποιούν ίδιο ύψος στη δημιουργία κυττάρων.

#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 πηγή δεδομένων και να αναθέτει
  • Εκχώρηση UITableViewAutomaticDimensionνα rowHeight & 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