web-dev-qa-db-de.com

UITableViewCell automatische Höhe basierend auf der Menge an UILabel-Text

Ich habe etwas kompliziertes in meinem Storyboard eingerichtet, ich habe einen UIViewController, der einen UITableViewController enthält. Im UITableViewController stehen mir mehrere Prototypzellen zur Verfügung, die ich im Code mit untergeordneten Klassenobjekten verknüpft.

Mit Einschränkungen und Storyboard möchte ich die Höhe meiner Prototypzelle in Abhängigkeit von der Größe des UILabels ändern, die vom Text abhängt, in den der Text eingefügt wird.

Momentan habe ich eine 

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)

In einigen Fällen möchte ich, dass das UILabel die Größe des UIView (Hintergrunds) ändert und dann die Höhe dieser UITableViewCell beeinflusst.

Ich verwende XCode 8.2.1

Ich habe einen Screenshot des Layouts im Storyboard und der angewendeten Einschränkungen gemacht.

 enter image description here

Aktualisieren

Ich habe meine Einschränkungen so aktualisiert, dass so ziemlich alle auf ContentView zurückgehen. Ich habe die Zeilenanzahl von uilabel auf 0 aktualisiert und dann auch den Code UITableViewAutomaticDimension implementiert, der jedoch immer noch nicht funktioniert. Siehe Code und Screenshots unten.

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

}

 enter image description here

 enter image description here

9
HurkNburkS

Um ein wenig weiter auf Daos Antwort zu gehen .. 

Er ist korrekt, Sie müssen UITableViewAutomaticDimension verwenden.

Sie müssen auch sicherstellen, dass Sie Ihre Einschränkungen so einstellen, dass der gesamte Inhalt der Zelle auf die Zellen-ContentView beschränkt ist. Daher benötigt Ihr Label wahrscheinlich Einschränkungen wie

  • Führende Einschränkung für ImageView
  • Oberste Einschränkung für contentView
  • Untere Einschränkung für contentView
  • Nachlaufende Einschränkung für contentView

Stellen Sie sicher, dass Sie das UILabel auf Multiline (oder Zeilen = 0) setzen, und es sollte funktionieren. 

Wenn Sie die Delegationsfunktionen von heightForRowAt verwenden, stellen Sie sicher, dass Sie UITableViewAutomaticDimension zurückgeben.

22
Scriptable

Verwenden Sie UITableViewAutomaticDimension

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300
11

schritt 1: Geben Sie UIView eine Einschränkung, die sich innerhalb der Inhaltsansicht befindet.

  • Führende Einschränkung für contentView
  • Oberste Einschränkung für contentView
  • Untere Einschränkung für contentView
  • Nachlaufende Einschränkung für contentView

schritt 2: Geben Sie UIlabel die folgende Einschränkung 

  • Führende Einschränkung für UIImageView
  • Oberste Einschränkung für UIView
  • Untere Einschränkung für UIView
  • Nachlaufende Einschränkung für UIView

schritt 3: Wählen Sie anschließend Ihre Trailing-Einschränkung von IUlabel aus, und wählen Sie die Bearbeitungsoption aus.

schritt 4: numberofline = 0 des Labels festlegen

schritt 5: Fügen Sie diesen Code in viewDidLoad() ein.

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

Swift 4.2 . Wie oben erwähnt, können Sie die UITableView-Objekteigenschaft oder festlegen

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

sie können dasselbe auch definieren, indem Sie UITableViewDelegate-Methoden implementieren

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