Поиск информации о пользовательском чертеже компонентов интерфейса (Cocoa)

Кажется, что все больше приложений OS X в эти дни делают всевозможные причудливые рисунки для пользовательских элементов управления. Приложения, такие как Twitterific, Things, EventBox, Versions, чтобы назвать несколько...

Итак, в основном я ищу любую информацию о том, как начать заниматься этим. Не уверен, что это делается только с помощью подклассификации элементов управления и использования пользовательского чертежа, или если это нечто совсем другое.

Любая помощь приветствуется. Спасибо!

Ответы

Ответ 1

Все зависит от того, что вы хотите сделать.

Кнопка "Показать исходные свойства" в Версии, например, является подклассом NSButton, потому что в основном нам нужно стандартное поведение кнопок с нашим собственным взглядом. Один из способов подкласса кнопки - просто реализовать собственный метод -drawRect: (NSRect) rect в подклассе NSButton, но мы решили придерживаться того, как NSButton реализован в Cocoa, что означает, что большая часть рисунка выполняется с помощью кнопки, поэтому реализация выглядит следующим образом:

В подклассе 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 appropriate
}

В подклассе NSButtonCell (OurButtonCell):

- (void)drawInteriorWithFrame: (NSRect) rect inView: (NSView *) controlView
{
    // a bunch of drawing code
}

Временная шкала в версиях - это фактически WebView, страница, которую вы видите в ней, использует javascript для обхода заголовков, на которые вы нажимаете.

Правило большого пальца, которое я использую для начала, с помощью настраиваемого элемента управления:

  • Чтобы настроить внешний вид стандартного элемента управления Cocoa:
    • подкласс соответствующего элемента управления (например, NSButton и NSButtonCell)
    • придерживаться так близко, чтобы иметь смысл, как реализован элемент управления по умолчанию (например, в кнопочной кнопке, начинайте с существующего метода attribitedTitle, чтобы нарисовать заголовок кнопки, если вы не всегда хотите рисовать с теми же атрибутами, независимо от того, какой набор в IB или если вам нужно рисовать с различными атрибутами на основе состояния, например, с кнопкой пробного истечения в главном окне Versions)
  • Создание полностью нового элемента пользовательского интерфейса:
    • подкласс NSView и реализовать практически все манипуляции с мышью и ключевыми словами (в представлении нет необходимости повторять "hitTest:" ) и рисовать код самостоятельно.
  • Представить нечто сложное, произвольной высоты, но не таблицу:
    • Посмотрите, можете ли вы сделать это в HTML, CSS и JS и представить его в WebView. Интернет отлично подходит для выкладки текста, поэтому, если вы можете разгрузить эту ответственность за свой WebView, это может стать огромной экономией боли в области шеи.

Рекомендуемое чтение о том, как нарисовать материал в собственных собственных методах рисования: Cocoa Руководство по рисованию

Настройка внешнего вида, например, NSTableView - это совсем другая чашка чая, благодаря сложности табличного представления, которое может происходить повсюду. Вы будете использовать свои собственные ячейки для некоторых вещей, которые вы хотите сделать в таблице, но вам придется изменить способ выделения строк в подклассе самого объекта NSTableView. Посмотрите, например, исходный код iTableView на сайт Мэтта Геммелла для четкого примера того, где рисовать.

Наконец, я думаю, что предложение Abizer пойти проверить код BWToolkit - отличная идея. Сначала это может быть немного подавляющим, но если вы можете прочитать и понять этот код, вам не составит труда реализовать свои собственные пользовательские представления и элементы управления.

Ответ 2

Посмотрите на отличный код примера: BWToolkit