Если вы все еще подкласс NSControl в 2018 году - PullRequest
0 голосов
/ 20 мая 2018

Начиная с 2018 года, как правильно создать собственный элемент управления с помощью AppKit / Cocoa?

Традиционный метод заключается в создании подкласса NSControl и / или NSCell для типа настраиваемого элемента управлениявы реализуете.(Например, NSButton, который выполняет нестандартное рисование.)

Однако в WWDC 2014-204 Apple заявила, что NSCell находится на пути к «формальному устареванию».В WWDC 2012-217 Apple предлагает создать подкласс NSView и воспользоваться преимуществами поддержки слоев и свойств слоев, чтобы нарисовать простую кнопку.

Если вы создадите подкласс NSView для создания пользовательского элемента управления (например, «кнопки с улучшением»), то вы потеряете много функций, которые предлагает NSControl, таких как предварительно подключенные action и target свойства, отслеживание мыши, активация клавиатуры и, возможно, куча других вещей, о которых я даже не подозреваю.

Если вы подкласс NSControl, или даже NSButton, как правильно взять на себя все чертежи? Руководство по программированию Apple не обновлялось по этому поводу.В частности, может ли подкласс NSButton просто переопределить все методы draw... от себя и NSCell, а затем просто сделать то, что он хочет сделать в updateLayer?Есть ли гарантия, что существующий NSButton/NSButtonCell код для рисования по-прежнему не будет рисовать?

Что, если вы хотите создать кнопку с пользовательским фоном, но по-прежнему используете строковые title или attributedTitle?NSButton предлагает это, но как рисунок title взаимодействует с updateLayer?

Мой вариант использования - создать пользовательскую кнопку, которая предлагает больше визуальных состояний и больше визуальных дизайнов, чем традиционный NSButton.Использование NSView и updateLayer с поддержкой слоев делает реализацию всех различных состояний быстрым, но я бы предпочел использовать подкласс NSControl или даже NSButton, чтобы я также сохранил все функциональные возможности, которые эти классы ужепредложение.

Редактировать 1: Изменена формулировка на основе комментариев ниже, чтобы более точно отразить текущее состояние устаревания NSCell.

...