web-dev-qa-db-fra.com

Hauteur automatique UITableViewCell basée sur la quantité de texte UILabel

J'ai un peu d'une configuration difficile dans mon storyboard, j'ai un UIViewController qui tient un UITableViewController. Dans UITableViewController, j'ai plusieurs prototypecells que j'ai liées à des objets de sous-classe uitableviewcell dans le code.

En utilisant des contraintes et un story-board, je voudrais changer la hauteur de ma cellule prototype en fonction de la taille que UILabel finit par être, laquelle dépend du texte qui y est inséré.

Actuellement j'ai un 

UIViewController
-- UITableViewController
-- -- UITableViewCell ((melchat) prototype cell)
-- -- -- ContentView
-- -- -- -- UIView ((background) view with drop shadow card type effect)
-- -- -- -- -- UIImageView (Avatar)
-- -- -- -- -- IUlabel (dynamic (depending on code/input) multi line UILabel)

Certains voudraient que UILabel redimensionne UIView (arrière-plan) puis affecte à son tour la hauteur de cet UITableViewCell.

J'utilise XCode 8.2.1

J'ai pris une capture d'écran de la mise en page dans le storyboard et des contraintes appliquées.

 enter image description here

Mettre à jour

J'ai mis à jour mes contraintes pour revenir à ContentView et j'ai mis à jour le nombre de lignes uilabel sur 0, puis implémenté le code UITableViewAutomaticDimension mais cela ne fonctionne toujours pas. Veuillez consulter le code et les captures d'écran ci-dessous.

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

}

 enter image description here

 enter image description here

9
HurkNburkS

Pour aller un peu plus loin sur la réponse de Dao .. 

Il a raison, vous devez utiliser UITableViewAutomaticDimension

En outre, vous devez vous assurer que vous définissez vos contraintes de manière à ce que tout le contenu de la cellule soit contraint aux cellules contentView. Donc, votre étiquette aura probablement besoin de contraintes telles que

  • Contrainte imposée à ImageView
  • Contrainte supérieure à contentView
  • Contrainte inférieure à contentView
  • Contrainte de fin à contentView

Assurez-vous que vous définissez UILabel sur multiligne (ou lines = 0) et cela devrait fonctionner. 

Si vous utilisez les fonctions de délégué heightForRowAt, assurez-vous de renvoyer UITableViewAutomaticDimension

22
Scriptable

Utilisez UITableViewAutomaticDimension

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300
11
Đào Minh Hạt

step1: Indiquez la contrainte ci-dessous à UIView qui se trouve à l'intérieur de contentView.

  • Contrainte principale vers contentView
  • Contrainte supérieure à contentView
  • Contrainte inférieure à contentView
  • Contrainte de fin à contentView

step2: Donne la contrainte ci-dessous à UIlabel 

  • Contrainte principale pour UIImageView
  • Principale contrainte pour UIView
  • Contrainte inférieure pour UIView
  • Contrainte de fuite vers UIView

étape 3: Ensuite, sélectionnez votre contrainte de fin d'IUlabel et sélectionnez l'option d'édition, puis sélectionnez constant et sélectionnez l'option GreaterThanEqual.

step4: définir le numberofline = 0 de l'étiquette

step5: Ajoutez ce code dans viewDidLoad()

yourtableview.estimatedRowHeight = 80.0
yourtableview.rowHeight = UITableViewAutomaticDimension
9
Brijesh Shiroya

Swift 4.2 . Comme mentionné ci-dessus, vous pouvez définir la propriété de l'objet UITableView ou

tblView.rowHeight = UITableView.automaticDimension 
tblView.estimatedRowHeight = 300

vous pouvez également définir la même chose en implémentant les méthodes UITableViewDelegate

extension ViewController: UITableViewDelegate {
      func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return 300
      }
      func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
      }
    }
1
GSK