2012-04-03 5 views
2

Ich verwende Storyboard, um eine der Prototypzellen als "Benutzerdefiniert" zu definieren und eine UITextField hinzuzufügen. Es gibt eine Beschriftung (mit statischem Text) auf der linken Seite. Es sieht irgendwie wie der Zelltyp "Right Detail" aus, nur dass der rechte Teil editierbar ist.Dynamische Größe von Unteransichten von UITableViewCell mit Storyboard-Prototypen

Gibt es eine Möglichkeit, das Textfeld ökonomisch so zu skalieren, dass es vom Ende des Textlabels bis zur rechten Kante reicht? Die Textbeschriftung auf der linken Seite sollte gerade groß genug sein, um den Text anzuzeigen.

Ich weiß über sizeToFit und sizeWithFont:constrainedToSize:, aber die Größenanpassung der Unteransichten scheint ziemlich umständlich und muss mit jedem Recycling einer Zelle wiederholt werden.

Gibt es eine Möglichkeit, mit autoresizingMask von UIView zu arbeiten, vielleicht durch Angabe in IB/Storyboard?

+0

ich die editierbare Seite geändert, denke, das ist, was Sie gemeint? Wie viel Text möchten Sie in das bearbeitbare Textfeld eingeben? 20 Zeichen, 20 Zeilen? – jrturton

+0

Danke für die Bearbeitung. Der Feldinhalt ist maximal eine Zeile. Der View-Controller dient zur Bearbeitung, die Daten müssen nicht einmal komplett angezeigt werden. – Mundi

Antwort

4

Ich glaube ich habe dich auf der vorherigen Frage enttäuscht, also geht hier etwas mit etwas mehr Aufwand.

Sie können etwas wie das folgende versuchen. Dies ist nur ein Beispielprojekt, um Ihnen eine ungefähre Vorstellung zu geben, aber es funktioniert ziemlich gut.

Ich habe ein leeres Projekt mit einem einzigen Tabellenansicht-Controller erstellt. Dies hatte eine fest codierte Anzahl von Abschnitten (1) und Reihen (10). Ich hatte eine einzige Prototypzelle vom Typ Basic. Sie können jede beliebige Ansicht als Zubehöransicht festlegen, also habe ich ein Textfeld verwendet. Die ganze Magie geschieht daher in cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 

    if (!cell.accessoryView) 
    { 
     UITextField *accessory = [[UITextField alloc] initWithFrame:CGRectMake(0.0, 0.0, 100.0, 30.0)]; 
     accessory.borderStyle = UITextBorderStyleLine; // Just so you can see the effect 
     cell.accessoryView = accessory; 
    } 

    NSMutableString *text = [NSMutableString stringWithFormat:@"A"]; 

    for (int i = 0; i < indexPath.row; i++) { 
     [text appendFormat:@"A"]; // Just to illustrate different sizes 
    } 

    cell.textLabel.text = text; 

    CGSize labelSize = [cell.textLabel.text sizeWithFont:cell.textLabel.font]; 
    CGRect accessoryFrame = cell.accessoryView.frame; 

    accessoryFrame.size.width = cell.bounds.size.width - labelSize.width - 40; 
    // 40 is a magic number to prevent overlaps, you could be cleverer here 
    // You'd also want to restrict to some minimum width. 
    cell.accessoryView.frame = accessoryFrame; 

    return cell; 
} 

Kernpunkte:

  • Sie müssen nur die Zubehör Ansicht ändern.
  • Das Textfeld ist ziemlich einfach - in der Regel möchten Sie eine kleine Factory-Methode, die einen Delegierten und wahrscheinlich eine Symbolleiste als Zubehöransicht mit vorherigen, nächsten und fertiggestellten Schaltflächen
  • zurückgibt in das Textfeld zurück in das Datenmodell eingegeben ist eine Übung für den Leser übrig.

Dies wird die folgende Ausgabe erzeugt:

enter image description here

+0

Sehr saubere Lösung. Perfekt klar und wirtschaftlich. Ich hatte an das 'AccessoryView' gedacht, aber wir müssen es aufgeben, alles in IB zu entwerfen. Nun, das ist ein guter Kompromiss. Vielen Dank! – Mundi

Verwandte Themen