Variable UITableViewCell Size

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Variable UITableViewCell Size

    hallo,

    Ich habe einen UiTableViewController, bei dem ich die Section per Tap auf die den Section header auf - / und zu klappen kann.
    Das realisiere ich in dem ich dann die rows der jeweiligen Section auf 0 setze und dann die die Tableview mit

    Quellcode

    1. [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
    aktualisiere.

    Nun schrumpfen aber meine anderen Cells, die eine variable Größe haben (abhängig vom text) auf die Standardsize von 44. Wie kann ich das verhindern?

    Jede Cell kann verschiedene Größen habe, die ich erst kenne wenn die Cell befüllt wurde...

    Danke & Grüße
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • Überleg doch mal was du da machst. Du fragst in cellForRow mittels heightForRow die Höhe ab und in heightForRow ermittelst du die Höhe durch den Aufruf von cellForRow???

    wer kennt denn nun die Höhe? Einer muss sie doch wissen.

    Der normale vorgang ist eigentlich, dass heightForRow cellFor row aufruft um die Höhe zu ermitteln. Aber cellForRow sollte die Höhe schon selber wissen. Sonst könnte sie die Celle ja gar nicht erstellen.

    noch optimaler muss heightForRow natürlich nicht cellForRow aufrufen sondern die Berechnung der Höhe ist nur ein kleiner teil von cellForRow. Denn die ganze Zelle zu erzeugen nur um die Höhe zu erfahren ist verdammt viel Overhead den ich vermeiden würde.

    Gruss

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Genau, du musst sagen wie hoch die Zelle ist: Also Texthöhe berechnen und daraus die Zellenhöhe ermitteln. Die wahrscheinlich einfachste Möglichkeit dafür ist, eine Zelle zu erstellen, zu konfigurieren, deren Layout zu berechnen und dann die Höhe zurückzuliefern.
    „Meine Komplikation hatte eine Komplikation.“
  • Darauf bin ich dann auch gekommen, aber irgendwie verstehe ich dann nicht wie ichs umsetzen soll.

    Ich erstelle die Cell folgendermaßen:

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. UITableViewCell *cell;
    4. if(indexPath.section == 0)
    5. {
    6. cell = (ProductTitleCell *)[tableView dequeueReusableCellWithIdentifier:@"ProductTitleCellID" forIndexPath:indexPath];
    7. if(!cell)
    8. {
    9. cell = (ProductTitleCell *)[[NSBundle mainBundle] loadNibNamed:@"ProductTitleCell" owner:self options:0][0];
    10. }
    11. cell.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:0.65];
    12. NSString *name = ((GDataXMLElement *)[_product elementsForName:@"prname"].firstObject).stringValue;
    13. NSString *subtitle = ((GDataXMLElement *)[_product elementsForName:@"prtite"].firstObject).stringValue;
    14. NSString *merkmale = ((GDataXMLElement *)[_product elementsForName:@"merkmale"].firstObject).stringValue;
    15. ((ProductTitleCell *)cell).productTitle.text = name;
    16. ((ProductTitleCell *)cell).productSubtitle.text = subtitle;
    17. ((ProductTitleCell *)cell).productMerkmale.text = [self cleanHTMLListing:merkmale];
    18. return cell;
    Alles anzeigen


    Nachdem ich name, subtitle und Produktmerkmale gesetzt habe weiß ich nun wie groß die Zelle ist.
    Wie gebe ich das nun an heightForRowAtIndexPath?

    Oder ist die herangehensweise schon komplett falsch?
    Every language has an optimization operator. In ObjC that operator is ‘//’.

    golbros.de
  • du brauchst die cell nicht um die größe bestimmen zu können denn sonst musst du ja 1.000 cells erstellen falls die tabelle 1.000 rows hat (denn die höhe will er vorab für alle rows wissen und nicht nur für jene rows die sichtbar sind (und nur für die gibt es normalerweise cells).
    du hast ja die daten und auch das wissen von welchen die höhe abhängt.
    anhand vom dem wissen und der breite der cell (bzw table) kannst du für jede row errechnen wie hoch die cell sein müsste (ohne eine cell zu erstellen).
    da sich die breite der row ja selten ändern sollte (nor beim rotieren) und die table die höhe der rows wohl öfter abfragen wird, kannst du die resultate auch cachen.