Градиент выбора NSOutlineview на основе вида - PullRequest
5 голосов
/ 27 августа 2011

Я все еще борюсь с основанным на представлении NSOutlineView в моем маленьком приложении Какао. Я пытаюсь смоделировать свой OutlineView после поиска. Когда Finder OutlineView теряет фокус (например, щелкая любую папку с правой стороны), выбранная строка (например, рабочий стол) остается выделенной с ярко-синим градиентом и не изменяется на неактивный сине-серый градиент.

Я хотел бы продублировать это поведение в моем приложении.

В OutlineView без представления я смог создать подкласс NSOutlineView и переопределить (void)highlightSelectionInClipRect:(NSRect)clipRect, чтобы каждая выделенная строка могла быть снабжена ярко-синим фоновым изображением.

Однако, теперь с моим OutlineView на основе представления (установленном в стиле SourceList) этот метод, по-видимому, даже не вызывается. Я даже реализовал (id)_highlightColorForCell:(NSCell *)cell, чтобы вернуть ноль, как предлагают некоторые сайты, но это тоже не помогает.

Любые советы о том, как я могу установить градиент подсветки в OutlineView на основе вида?

Ответы [ 2 ]

8 голосов
/ 06 сентября 2011

Делаете ли вы какой-нибудь нестандартный рисунок, который может мешать вещам? Насколько я могу судить, все выделенные чертежи обрабатываются для вас нормально, посмотрите пример TableViewPlayground (по умолчанию это не стиль списка источников, но это легко изменить в XIB).

Но если этого не сделать, то в соответствии с документацией Mac OS X 10.7 на highlightSelectionInClipRect:

Примечание. Этот метод не должен быть разделен на подклассы или переопределен для табличного представления вида. Вместо этого настройку рисования строк следует выполнять путем создания подкласса NSTableRowView.

Поэтому я думаю (я не пробовал ничего из этого), как если бы вы хотели создать подкласс NSTableRowView, переопределить drawSelectionInRect: (в TableViewPlayground есть пример и нарисовать ваш выбор. Вы можете проверить если приложение активно с [NSApp active] или может использовать свойство self.emphasized, как в примере.

Затем вы вернете один из ваших пользовательских NSTableRowView в методе протокола NSOutlineViewDelegate (только 10.7!): (NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item

Надеюсь, это работает / помогает!

Следует отметить, что в примере TableViewPlayground по умолчанию используется метод делегата outlineView:viewForTableColumn:item:, и он все делает с NSTableViewCells, но если вы добавите метод rowViewForItem, о котором я упоминал выше, вызывается . Так что, думаю, вы могли бы использовать его, чтобы вернуть представление для каждой строки целиком.

6 голосов
/ 07 сентября 2011

Спасибо, с вашей подсказкой мне удалось довольно легко решить проблему.Я вложил в подкласс NSTableRowView и переписал -(BOOL) isEmphasized, чтобы всегда возвращать true.

Затем я реализовал -(NSTableRowView *)outlineView:(NSOutlineView *)outlineView rowViewForItem:(id)item в моем делегате OutlineViews, чтобы возвратить экземпляр моего подкласса для конкретного элемента, вызвав ClbTableRowView *result = [outlineView makeViewWithIdentifier:identifier owner:self];

Edit: Кроме того, здесь также кажетсябыть довольно скрытым способом использования пользовательского подкласса NSTableRowView, добавив новый объект NSView в OutlineView в Интерфейсном Разработчике.Затем установите класс представлений для своего подкласса и присвойте ему идентификатор элемента пользовательского интерфейса «NSTableViewRowViewKey», согласно документации Apple .

...