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.
J'ai donné une contrainte de vue gauche comme celle-ci
Contraintes de libellé d'élément
contraintes de vue centrées
vue droite constarints
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.
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:
SeparatorView:
DescriptionLabel:
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,
J'espère que cela vous aiderait.
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.
UITableViewAutomaticDimension
à rowHeight & installedRowHeightheightForRowAt
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
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.
Vous devez définir la hauteur maximale estimée lors du chargement de la vue.
tblObject.estimatedRowHeight = 300;
tblObject.rowHeight = UITableViewAutomaticDimension;
C'est comme ça que j'ai travaillé.
1) Set no. des lignes à 0.
2) Définissez LineBreakage.
3) Ajouter des contraintes.
4) Modifiez la priorité du contenu vertical.
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()
}
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
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
}
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
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.
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.