Это полностью зависит от того, что вы хотите сделать.
Например, кнопка «Показать исходные свойства» в Versions является подклассом NSButton, потому что в основном нам нужно было стандартное поведение кнопки с нашим собственным внешним видом. Один из способов создания подкласса для кнопки - просто реализовать собственный метод -drawRect: (NSRect) rect в подклассе NSButton, но мы решили придерживаться способа, которым NSButton реализован в Какао, то есть большинство рисования выполняется ячейкой кнопки, поэтому реализация выглядит так:
В подклассе NSButton:
+ (Class) cellClass
{
return [OurButtonCell class];
}
- (void)drawRect:(NSRect)rect
{
// first get the cell to draw inside our bounds
// then draw a focus ring if that's appropriate
}
В подклассе NSButtonCell (OurButtonCell):
- (void)drawInteriorWithFrame: (NSRect) rect inView: (NSView *) controlView
{
// a bunch of drawing code
}
Представление временной шкалы в версиях на самом деле является веб-представлением, и страница, которую вы видите на нем, использует JavaScript для свертывания заголовков, по которым вы щелкаете.
Эмпирическое правило, которое я использую для начала работы с пользовательским элементом управления:
- Чтобы настроить внешний вид стандартного элемента управления Какао:
- подкласс соответствующего элемента управления (например, NSButton и NSButtonCell)
- придерживайтесь настолько близко, насколько это имеет смысл к способу реализации элемента управления по умолчанию (например, в кнопочной ячейке, начните с существующего метода экземпляра attribuTitle, чтобы нарисовать заголовок кнопки, если вы не хотите всегда рисовать с одинаковыми атрибутами независимо от того, что установлено в IB или если вам нужно рисовать с другими атрибутами в зависимости от состояния (например, с помощью кнопки истечения срока действия пробной версии в главном окне версий)
- Создание совершенно нового элемента пользовательского интерфейса:
- создает подкласс NSView и реализует практически все операции с мышью и ключами (в представлении, нет необходимости повторять «hitTest:») и рисовать код самостоятельно.
- Чтобы представить что-то сложное, произвольной высоты, но не таблица:
- Посмотрите, можете ли вы сделать это в HTML, CSS и JS и представить его в WebView. Сеть отлично подходит для выкладывания текста, поэтому, если вы сможете переложить эту ответственность на свой WebView, это может привести к огромной экономии боли в шее.
Рекомендуемое чтение при изучении того, как рисовать вещи в собственных методах рисования собственного вида: Руководство по рисованию какао
Настройка внешнего вида, например, NSTableView - это совсем другая чашка чая, благодаря сложности представления таблицы, которая может происходить повсюду. Вы будете реализовывать свои собственные пользовательские ячейки для некоторых вещей, которые вы хотите сделать в таблице, но вам придется изменить способ выделения строк в подклассе самого фактического объекта NSTableView. См., Например, исходный код iTableView на сайте Мэтта Геммелла , чтобы наглядно показать, где что рисовать.
Наконец, я думаю, что предложение Abizer проверить код BWToolkit - отличная идея. Сначала это может показаться немного сложным, но если вы сможете прочитать и понять этот код, у вас не возникнет проблем с реализацией ваших собственных пользовательских представлений и элементов управления.