web-dev-qa-db-fra.com

Augmenter dynamiquement la hauteur de UILabel & TableView Cell?

J'ai un UITableView dans lequel j'affiche une cellule personnalisée. J'ai ma cellule, j'ai deux étiquettes et une vue comme ci-dessous dans l'image.

 enter image description here

J'ai donné une contrainte de vue gauche comme celle-ci 

Contraintes de libellé d'élément 

 enter image description here

contraintes de vue centrées 

 enter image description here

vue droite constarints

 enter image description here
J'utilise une classe de haricot pour stocker des données pour deux étiquettes et ajouter cet objet de haricot dans un tableau.J'utilise le code ci-dessous dans 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;
}

Le problème n'est ni la hauteur de l'étiquette ni celle de la cellule de la vue tableau.J'ai tout expliqué. Je souhaite augmenter la taille de l'étiquette en cas d'augmentation du texte de l'étiquette et également lorsque la taille de l'étiquette augmente, la hauteur de la cellule doit augmenter.

14
Dheeraj Kumar

Tout d'abord, vous ne devez pas calculer la hauteur manuellement dans un environnement de mise en page automatique. Il suffit de définir les étiquettes TopSpace et BottomSpace sur contentView de la cellule et de définir les étiquettes NumberOfLines sur 0 et LineBreakMode sur WordWrap.

Et l'autre contrainte sont comme ci-dessous,

ItemLabel:

 enter image description here

SeparatorView:

 enter image description here

DescriptionLabel:

 enter image description here

Et ajoutez les délégués pour la hauteur comme ci-dessous,

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

    return 44.0;
}

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

    return UITableViewAutomaticDimension;
}

Vous devriez obtenir la sortie ci-dessous,

 enter image description here

J'espère que cela vous aiderait.

31
Bharat Modi

Pour définir la dimension automatique pour la hauteur de ligne et la hauteur estimée de la ligne, assurez-vous que les étapes suivantes permettent de rendre la cote automatique effective pour la présentation de hauteur de cellule/ligne.

  • Affecter et mettre en œuvre tableview dataSource et déléguer
  • Attribuez UITableViewAutomaticDimension à rowHeight & installedRowHeight
  • Implémenter des méthodes delegate/dataSource (c'est-à-dire heightForRowAt et lui renvoyer une valeur UITableViewAutomaticDimension)

-

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

Rapide:

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

Pour l'instance d'étiquette dans UITableviewCell

  • Définir le nombre de lignes = 0 (& mode de saut de ligne = tronquer la queue)
  • Définissez toutes les contraintes (haut, bas, droite à gauche) par rapport à son conteneur superview/cell.
  • Facultatif: définissez la hauteur minimale de l'étiquette, si vous voulez une zone verticale minimale couverte par l'étiquette, même s'il n'y a pas de données.

enter image description here

Remarque : Si vous avez plusieurs étiquettes (UIElements) avec une longueur dynamique, ajustez-les en fonction de la taille de son contenu. priorité plus élevée.

5
Krunal

Vous devez définir la hauteur maximale estimée lors du chargement de la vue.

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

C'est comme ça que j'ai travaillé.

1) Set no. des lignes à 0.

2) Définissez LineBreakage.

 enter image description here

3) Ajouter des contraintes.

 enter image description here

4) Modifiez la priorité du contenu vertical.

 enter image description here

5) Sur ViewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

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

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

6) Sur la cellule personnalisée TableView:

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

    sizeToFit()
    layoutIfNeeded()
}
4
A.G

Donnez votre contrainte d'étiquette en haut à la cellule, en bas à la cellule et conservez votre contrainte de début et de fin telle qu'elle est . 

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

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

en utilisant UITableViewAutomaticDimension, la hauteur de la cellule vue de table augmente en fonction du contenu de votre étiquette. Le point le plus important est: sélectionnez votre étiquette, puis accédez à Inspecteur de l'identité et, en nombre de lignes, écrivez 0

2
Vatsal Raval

Swift 3/Swift 4 

Cellule personnalisée:

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

}

Et 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

Pour le type de cellule Basic ou Subtitle, commencez par viewDidLoad:

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

 enter image description here

Sélectionnez ensuite le titre et définissez le nombre de lignes sur 0. La hauteur de la ligne sera ajustée en fonction du texte du titre. Vous n'avez rien d'autre à faire.

 enter image description here

Il en va de même pour vos types de cellules personnalisés. Assurez-vous que l'étiquette que vous utilisez dans votre cellule personnalisée est également définie sur 0 ligne.

0
zeeshan