Увеличьте слишком узкий интервал между значками в NSOutlineView
-
22-07-2019 - |
Вопрос
Я пишу приложение Cocoa, которое отображает содержимое архивного файла в Просмотр NSOutlineView.Я предоставляю пользовательские иконки для NSBrowserCell в столбце "структура", но мне не удалось правильно расставить интервалы — значок папки всегда отображается слишком близко к треугольнику раскрытия, как показано ниже.(FWIW, Версии и Лучшая застежка - молния оба отображают похожие данные без проблем с интервалами.)
NSOutlineView-интервал между значками http://img.skitch.com/20090918-tgfjh9x8dhgqxqnb2su8fby4ng.jpg
Поскольку эта проблема будет возникать только с значками папок, я действительно забочусь только об исправлении интервала в этом контексте.(ПРИМЕЧАНИЕ:Я уже кэширую значки для повторного использования, поэтому у меня нет проблем с манипулированием изображением папки, если это необходимо, поскольку в любом случае это произойдет только один раз.) Я не уверен, есть ли что-то, что я могу настроить в экземпляре NSBrowserCell, но я пока не нашел ничего, что работало бы, не из-за отсутствия попыток.
Для любознательных, Джарскан это удобный (бесплатный) инструмент командной строки для поиска классов Java в файлах JAR.
Решение
"Столбец таблицы структуры" (см. -[NSOutlineView outlineTableColumn]
) является NSTableColumn - столбец это рисует треугольник и левое заполнение по мере необходимости для отображения иерархии.Ячейкой по умолчанию для отображения содержимого таблицы является NSTextFieldCell - ячейка NSTextFieldCell.Чтобы увеличить интервал, который вы видите, вы должны выполнить рисование в пользовательском подклассе NSTextFieldCell .Интервал достигается путем рисования вашего изображения со смещением x.(Контурный вид нарисует треугольник раскрытия независимо от того, какой подкласс NSCell используется.)
Обратите внимание, что вам, возможно, придется переопределить следующие методы для корректного рисования, когда ячейка может быть введена, выбрана для редактирования и всплывающая подсказка:
-[NSCell editWithFrame:inView:editor:delegate:event:]
-[NSCell selectWithFrame:inView:editor:delegate:start:length:]
-[NSCell expansionFrameWithFrame:inView:]
По умолчанию ваши пользовательские текстовые прямоугольники будут игнорироваться текстовым полем, и они будут отображаться странно.