Ищете информацию о нестандартном рисовании компонентов интерфейса (Какао) - PullRequest
13 голосов
/ 19 декабря 2008

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

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

Любая помощь очень ценится. Спасибо!

Ответы [ 2 ]

25 голосов
/ 19 декабря 2008

Это полностью зависит от того, что вы хотите сделать.

Например, кнопка «Показать исходные свойства» в 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 - отличная идея. Сначала это может показаться немного сложным, но если вы сможете прочитать и понять этот код, у вас не возникнет проблем с реализацией ваших собственных пользовательских представлений и элементов управления.

3 голосов
/ 19 декабря 2008

Взгляните на прекрасный пример кода: BWToolkit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...