2012-03-29 33 views
1

Ich möchte eine gemeinsame und richtige Art der Berechnung der Höhe für benutzerdefinierte Zellen lernen.
Meine Zellen werden von der Spitze geladen, sie haben zwei mehrzeilige UILabels übereinander.
Momentan erstelle ich eine spezielle Konfigurationszelle in viewDidLoad und verwende sie in heightForRowAtIndexPath.iOS der richtige Weg der HöheForRowAtIndexPath Berechnung

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

    [self configureCell:self.configurationCell forIndexPath:indexPath]; 
    CGRect configFrame = self.configurationCell.frame; 
    configFrame.size.width = self.view.frame.size.width; 
    self.configurationCell.frame = configFrame; 

    [self.configurationCell layoutSubviews]; 

    UILabel *label = (UILabel *)[self.configurationCell viewWithTag:2]; 
    float height = label.frame.origin.y + label.frame.size.height + 10; 

    return height; 
} 

Es funktioniert, scheint aber eine schlechte Art und Weise zu sein. Ich denke, dass Höhen für jeden Gegenstand und jede Orientierung vorausberechnet werden müssen. Aber ich finde keinen Weg, um es schön und unkompliziert zu machen.
Können Sie mir helfen?
Der Stil von Cell Labels (wie Schriftart und Offsets von den Bildschirmrändern) muss aus der NIB-Datei geladen werden (Zelle befindet sich in der Nib).

Added Zelle layourSubviews Methode:

-(void) layoutSubviews { 

    [super layoutSubviews]; 

    [self.shortDescriptionLabel resize]; 

    CGRect longDescriptionFrame = self.longDescriptionLabel.frame; 
    longDescriptionFrame.origin.y = self.shortDescriptionLabel.frame.origin.y + self.shortDescriptionLabel.frame.size.height + 5; 
    self.longDescriptionLabel.frame = longDescriptionFrame; 

    [self.longDescriptionLabel resize]; 
} 

Resize-Methode Etiketten einfach erhöht es Höhe ist den ganzen Text zu passen. So wird die Höhe der Zelle berechnet als longDescriptionLabel.bottom + 10. Einfacher Code, aber nicht sehr schön.

Antwort

1

Es scheint, dass Sie versuchen, Unteransichten innerhalb heightForRowAtIndexPath zu erstellen. Die Ansichtserstellung soll in cellForRowAtIndexPath erfolgen.

Entsprechend Ihrer Implementierung können Sie die Höhe der Zelle nur bestimmen, nachdem sie angelegt wurde. Das ist nicht gut, denn UITableView ruft heightForRowAtIndexPath für jede Zelle, nicht nur die sichtbaren beim Daten neu laden. Dadurch werden Teilansichten aller Zellen erstellt, auch wenn sie nicht sichtbar sein müssen.

Um diese Implementierung zu optimieren, müssen Sie eine Formel ausarbeiten, mit der Sie die Höhe bestimmen können, ohne Ansichten zu definieren. Auch wenn Ihr Layout elastisch ist oder eine variable Höhe hat, können Sie bei gegebenem Textrechteck seine Höhe bestimmen. Verwenden Sie [NSString sizeWithFont:], um das angezeigte Rechteck zu bestimmen. Notieren Sie diese Informationen in Ihrem Datendelegaten. Wenn heightForRowAtIndexPath aufgerufen wird, geben Sie es direkt zurück.

+0

Ich erstelle nichts in heightForRowAtIndexPath. Ich stelle einfach Texte und Anruflayout für die Zellenansicht ein. Diese Konfigurationszelle wird einmal aus der NIB-Datei in der ViewDidLoad erstellt. Sie liegen also falsch - in heightForRowAtIndexPath werden keine Ansichten erstellt. Ich möchte einen direkten Weg finden, um Berechnungen durchzuführen. Die Schriftgrößen und -abmessungen der Zelle im Controller zu bekommen, ist zu kompliziert für mich. – Division

+0

Nun, du hast keinen Inhalt für '' layoutSubviews'' bereitgestellt, also ist es eine Blackbox für mich. Trotzdem steht mein Vorschlag immer noch. In '' heightForRowAtIndexPath'' sollten Sie nichts Kompliziertes machen, da es für jede Zeile aufgerufen wird. Ich spreche von einer optimalen Wahl, wo Sie Ihre Ansicht ordnen können. Wenn Sie das Gefühl haben, dass es zu kompliziert ist, brauchen Sie diese Optimierung nicht. –

+0

Ich habe meinem Beitrag die layoutSubviews-Methode hinzugefügt. Es ist nicht kompliziert, wie Sie sehen können. Sollte ich diesen einfachen Ansatz ohnehin durch Höhenvorberechnung ersetzen? – Division

Verwandte Themen