Начиная с 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.