/ / Как да осъществите преоразмеряването на NSTableCellView въз основа на размера на неговия NSTextField? - цел-c, мако, какао, nstableview

Как да осъществите преоразмеряването на NSTableCellView въз основа на размера на неговия NSTextField? - цел-c, мако, какао, nstableview

Знам, че в табличен изглед, базиран на изгледите, редътклас NSTableCellView подкласове от NSView. Този клас съдържа два свойства - NSTextField и NSImageView. Използвам само NSTextField без изображение. Някои клетки обаче в таблицата ми трябва да съдържат няколко реда текст, докато други могат да съдържат само един или два реда. Трябва да мога да променя размера на отделните изгледи на NSTableCellView в зависимост от размера на свойството NSTextField textField.

Ето защо трябваше да направя следното:

  1. Получете frameSize на NSTextField в изгледа на таблицата клетки.
  2. Задайте frameSize на NSTableCellView на frameSize на NSTextField (този, който имаме в комплект)

Въпреки това, този подход не е работил.Аз започнах да мисля, че подходът ми за преоразмеряване на NSTableCellView е неправилен.Тук е кодът, който съм използвал:

[tableCellView setFrameSize:[[tableCellView textField] frame].size];
[tableCellView setNeedsDisplay:YES];

Има ли проблем с този подход? Бих очаквал клетката да преоразмерява, но това не е? Какво става?

Благодаря.

Отговори:

2 за отговор № 1

[редактиране] Би трябвало да започна, като коментирам, че размерът на textField няма нищо общо с това колко голяма би трябвало да бъде, за да се покаже цялото му съдържание.

Използвам този код, за да определям височината на низ на базата на ширината на клетката на таблицата:

- (CGFloat) displayStringHeightWithWidth:(CGFloat)width
{
CGSize size = NSMakeSize(width,0);
NSRect bounds = [self.displayString boundingRectWithSize:size
options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading];
return bounds.size.height;
}

В идеалния случай можете да го адаптирате, за да намерите височината на textField.stringValue или textField.attributedStringValue. Не че горното е също от OSX, а не от iOS, така че YMMV на някои от пух.

Така че промените алгоритъма на:

  1. Получете ширината на таблицата в таблицата
  2. Вземете височината на необходимата граница за текстовото поле
  3. Кажете на таблицатаПогледнете, че височината на реда е всичко, което сте намерили в 2

Сега. По отношение на # 3. Вярвам, че вие имам да се използва tableView: heightOfRow: в протокола NSTableViewDelegate, както и да се обадите на бележката в таблицатаHeightOfRowsWithIndexesChanged: за да промените височините на редовете. Таблицата не вижда, че височината на клетката ви е променена. Обърнете внимание на дискусията в документацията, Може би вашият метод ще работи без делегат и просто казва на масата, че височината на реда за редове, които се променяте, са мръсни ... но аз не бих го очаквал.