Ich brauche ein wenig Hilfe bei NSTableView und dynamischen ZeilenhöheView-basierte NSTableView, stellen Zeilenhöhe abhängig von Inhalt
Was ich habe:
eine einspaltige Ansicht basierte NSTableView an ein gebundenes Array-Controller. Jede NSTableCellView enthält drei Teilansichten: NSImageView, NSTextField (einzelne Zeile) und NSTextField (mehrzeilig). Im Grunde ist dies eine Chat-Oberfläche, so dass Sie eine Liste mit Nachrichten, Absendern und Avataren haben.
Was ich will, erreichen:
Wenn der Text länger ist als Mindesthöhe der Reihe, erweitert die Reihe Inhalt passen. Ähnlich wie bei iMessage erweitern sich die Bläschen, um der Nachricht zu entsprechen.
... das scheint eine sehr natürliche Sache zu sein, aber von allen relevanten Lösungen, die ich online fand, (Ref 1, Ref 2), nichts von denen funktioniert für mich.
Ref 2 sieht fantastisch aus, aber das trifft nicht auf meine Anwendung zu, da das Beispielprojekt einen Layoutcode von Drittanbietern verwendet und das Ganze für iOS entworfen wurde. Ref 1 hat eine vielversprechende Lösung geschrieben, gut, Englisch. Ich habe versucht, es mit einer "Dummy-Ansicht" einzurichten, wie in der Lösung beschrieben, konnte aber die Höhe nicht richtig ändern und messen.
Hier ist mein Code für tableView:heightOfRow:
, _samplingView
ist die Dummy-Ansicht, die Arbeitseinschränkungen hat und identisch mit der in tableView
ist.
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
NSTextField *textField;
NSTextFieldCell *messageCell;
for (NSView *subview in [_samplingView subviews]) {
if ([[subview identifier] isEqualToString:@"message"]) {
textField = (NSTextField*)subview;
messageCell = ((NSTextField*)subview).cell;
}
}
Message *message = [[_messagesArrayController arrangedObjects] objectAtIndex:row];
_samplingView.objectValue = message;
CGFloat width = [[[tableView tableColumns] objectAtIndex:1] width];
[_samplingView setBounds:NSMakeRect(0, 0, width, CGFLOAT_MAX)];
[_samplingView display];
CGFloat optimalHeight = 10 + [messageCell cellSize].height; //messageCell's size stays the same when I change samplingView to try to measure the height
return optimalHeight;
}
Ergebnis: alle Zeilenhöhen gleich bleiben, irgendwie, wenn ich die Breite von _samplingView
ändern, ist es nicht die Größe neu messageCell
‚s Größe. Ich dachte Auto-Layout würde sich um diese Komprimierung/Expansion kümmern und mir erlauben, die Höhe zu messen. In der Tat bin ich sehr verwirrt.
Edit: als Referenz, ist es das, was meiner Ansicht nach wie
+-----------+---------------------------------------------------+
| | NSTextField |
|NSImageView| sender |
| avatar +---------------------------------------------------+
| | |
| | NSTextField (multiline) |
+-----------| message |
| | |
| | (high compression/hugging priority) |
| | (this view should decide the height of row) |
| | |
+-----------+---------------------------------------------------+
Haben Sie jemals die Lösung dafür gefunden? –
@Jai, ich habe einen Stich gemacht. – stevesliva