wake-up-neo.com

Die Höhe der UILabel & TableView Cell dynamisch erhöhen?

Ich habe eine UITableView, in der ich eine benutzerdefinierte Zelle zeige. Ich habe zwei Anzeigen und eine Ansicht wie unten in Bild.

 enter image description here

Ich habe die Einschränkung der linken Ansicht so gegeben 

Artikelbeschränkungen 

 enter image description here

zentrierte Ansichtseinschränkungen 

 enter image description here

rechte Ansichtskonstanten

 enter image description here
Ich verwende eine Bean-Klasse, um Daten für zwei Labels zu speichern und dieses Bean-Objekt in ein Array einzufügen. Ich verwende den folgenden Code in heightForRowAtIndexPath.

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

    // Calculate a height based on a cell
    if(!self.customCell) {
        self.customCell = [self.tableView dequeueReusableCellWithIdentifier:@"thirdcell"];
    }

    // Configure the cell
    Instrument *inst=[arr_instSpecs objectAtIndex:indexPath.row];
    self.customCell.label_item.text=inst.item;
    self.customCell.label_desc.text=inst.desc;


    // Layout the cell

    [self.customCell layoutIfNeeded];

    // Get the height for the cell

    CGFloat height = [self.customCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    // Padding of 1 point (cell separator)
    CGFloat separatorHeight = 1;

    return height + separatorHeight;
}

Das Problem ist weder die Etikettenhöhe noch die Tabellensichtzelle. Ich habe alles erklärt. Ich möchte, dass die Etikettengröße zunimmt, wenn der Text der Beschriftung zunimmt. Auch wenn die Etikettengröße ansteigt, muss die Höhe der Zelle zunehmen.

14
Dheeraj Kumar

Zunächst sollten Sie die Höhe in der automatischen Layout-Umgebung nicht manuell berechnen. Setzen Sie einfach beide Labels TopSpace und BottomSpace auf contentView der Zelle, und stellen Sie sicher, dass Sie beide Labels NumberOfLines auf 0 und LineBreakMode auf WordWrap setzen.

Und die anderen Einschränkungen sind wie folgt:

ItemLabel:

 enter image description here

SeparatorView:

 enter image description here

DescriptionLabel:

 enter image description here

Und fügen Sie die Delegaten für die Höhe wie folgt hinzu:

#pragma mark - UITableView Delegates
-(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {

    return 44.0;
}

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

    return UITableViewAutomaticDimension;
}

Sie sollten die Ausgabe wie unten erhalten,

 enter image description here

Hoffe das würde dir helfen.

31
Bharat Modi

Stellen Sie zum Festlegen der automatischen Bemaßung für die Zeilenhöhe und die geschätzte Zeilenhöhe die folgenden Schritte ein, um die automatische Bemaßung für das Layout der Zellen-/Zeilenhöhe wirksam zu machen.

  • Zuweisen und Implementieren der TableView-DataSource und des Delegaten
  • Weisen Sie UITableViewAutomaticDimension rowHeight & geschätzteRowHeight zu
  • Implementieren Sie Delegate/dataSource-Methoden (d. H. heightForRowAt und geben Sie einen Wert UITableViewAutomaticDimension zurück).

-

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

Swift:

@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
    // Swift 4.2 onwards
    table.rowHeight = UITableView.automaticDimension
    table.estimatedRowHeight = UITableView.automaticDimension


    // Swift 4.1 and below
    table.rowHeight = UITableViewAutomaticDimension
    table.estimatedRowHeight = UITableViewAutomaticDimension

}



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

    // Swift 4.1 and below
    return UITableViewAutomaticDimension
}

Für die Labelinstanz in UITableviewCell

  • Setze Zeilenanzahl = 0 (& Zeilenumbruchmodus = Ende abschneiden)
  • Legen Sie alle Einschränkungen (oben, unten, rechts links) in Bezug auf den Superview-/Zellencontainer fest.
  • Optional: Legen Sie die Mindesthöhe für die Beschriftung fest, wenn Sie möchten, dass der vertikale Mindestbereich durch die Beschriftung abgedeckt wird, auch wenn keine Daten vorhanden sind.

enter image description here

Hinweis : Wenn Sie mehr als ein Label (UIElements) mit dynamischer Länge haben, das entsprechend seiner Inhaltsgröße angepasst werden sollte: Passen Sie 'Content Hugging und Compression Resistance Priority' für Labels an, mit denen Sie expandieren/komprimieren möchten Höhere Priorität.

5
Krunal

Sie müssen die maximale geschätzte Höhe definieren, wenn die Ansicht geladen wird

tblObject.estimatedRowHeight = 300;
tblObject.rowHeight = UITableViewAutomaticDimension;
4
Meera

So habe ich gearbeitet.

1) Set-Nr. von Zeilen auf 0.

2) Stellen Sie LineBreakage ein.

 enter image description here

3) Fügen Sie Einschränkungen hinzu.

 enter image description here

4) Ändern Sie die Priorität der vertikalen Inhalte.

 enter image description here

5) Bei ViewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    self.sampleTableView.estimatedRowHeight = 600.0;
    self.sampleTableView.rowHeight = UITableViewAutomaticDimension;

    self.sampleTableView.setNeedsLayout()
    self.sampleTableView.layoutIfNeeded()
}

6) In der benutzerdefinierten TableView-Zelle:

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    sizeToFit()
    layoutIfNeeded()
}
4
A.G

Geben Sie Ihre Labelbeschränkung als oberste Zelle für Zelle und unten für eine Zelle an, und behalten Sie Ihre führende und nachfolgende Einschränkung bei, wie sie ist 

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

-(CGFloat)tableView:(UITableView *)tableView
    estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

durch die Verwendung von UITableViewAutomaticDimension wird die Höhe der Tableview-Zellen entsprechend dem Inhalt Ihres Labels vergrößert. Der wichtigste Punkt ist: Wählen Sie Ihr Label aus und gehen Sie zu Identity Inspector. Geben Sie in Zeilenanzahl 0 ein.

2
Vatsal Raval

Swift 3/Swift 4 

Benutzerdefinierte Zelle:

class CustomCell: UITableViewCell {

    @IBOutlet var messageLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()

        sizeToFit()
        layoutIfNeeded()

    }

}

viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()        

    self.tableView.estimatedRowHeight = 80
    self.tableView.rowHeight = UITableViewAutomaticDimension

}

Und cellForRowAtIndexPath:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

     let cell : CustomCell = tableView.dequeueReusableCell(withIdentifier: "yourcellIdentifier", for: indexPath) as! CustomCell
     cell.messageLabel.text = exampleContent[indexPath.row]
     cell.messageLabel.sizeToFit()
     cell.messageLabel.layoutIfNeeded()
     return cell

}

1
john raja

Swift 4.2

Für den Zelltyp Basic oder Subtitle tun Sie zuerst in viewDidLoad Folgendes:

    self.tableView.estimatedRowHeight = 44 // This is the default cell height
    self.tableView.rowHeight = UITableView.automaticDimension

 enter image description here

Wählen Sie dann den Titel aus und setzen Sie die Anzahl der Zeilen auf 0. Nun wird die Höhe der Zeile basierend auf dem Titeltext angepasst. Sie müssen nichts anderes tun.

 enter image description here

Gleiches gilt für Ihre benutzerdefinierten Zelltypen. Stellen Sie sicher, dass das Label, das Sie in Ihrer benutzerdefinierten Zelle verwenden, auch auf 0 Zeilen eingestellt ist.

0
zeeshan