Как я могу создать файл внешнего вида для NSAppearance?

Я читал документацию Cocoa и наткнулся на некоторые новые функции в API 10.9.

Из документов я понял, что класс NSAppearance и связанный с ним протокол NSAppearanceCustomization выглядит как средство настройки внешнего вида NSView и его потомков.

Объект NSAppearance представляет файл, определяющий стандартный или настраиваемый внешний вид, который применяется к подмножеству элементов пользовательского интерфейса в приложении. Приложение может содержать несколько файлов внешнего вида, и — поскольку NSAppearance соответствует NSCoding — вы можете использовать Interface Builder для назначения элементов пользовательского интерфейса внешнему виду.
Как правило, вы настраиваете окно, используя Xcode для создания файла внешнего вида, который содержит виды, которые вы хотите настроить, и пользовательские изображения, которые следует к ним применить. Xcode преобразует художественное содержимое файла в формат времени выполнения, который AppKit может рисовать при отображении указанных представлений.

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

Я вижу, что UIKit имеет похожий по звучанию класс UIAppearance, но, насколько я могу судить, это не прямой порт класса UIKit.

Кто-нибудь знает, как сделать один из этих волшебных "файлов внешнего вида" и что именно мы можем с ними сделать?


person Brad Allred    schedule 05.11.2013    source источник
comment
Интересно получить минус по этому поводу после стольких лет. Что-то изменилось в Mac OS 10.10 по этому поводу?   -  person Brad Allred    schedule 23.09.2014


Ответы (2)


Существует частная структура под названием «CoreThemeDefinition», которая обрабатывает файлы uicatalog, эти файлы можно преобразовать в файлы «.car» и загрузить с помощью NSAppearance. Лично я думаю, что Apple в будущем включит редактор в Xcode, но пока вы можете использовать этот небольшой инструмент, который я сделал: https://github.com/insidegui/AppearanceMaker

Сначала вы открываете приложение и выбираете место для сохранения файла uicatalog, затем нажимаете «создать скелет». Это позволит экспортировать различные PSD-файлы, содержащие изображения по умолчанию для элементов управления, затем вы можете редактировать их, сохранять и экспортировать файл автомобиля с помощью приложения.

Этот файл должен быть включен в ресурсы вашего приложения, и вы загружаете этот настраиваемый внешний вид, используя:

[[NSAppearance alloc] initWithAppearanceNamed:@"Your-appearance-name" bundle:nil]
person Guilherme Rambo    schedule 16.04.2014
comment
не могли бы вы расширить этот ответ здесь (вместо того, чтобы просто публиковать ссылку)? Я бы, вероятно, принял этот ответ, если бы он действительно содержал некоторую информацию, найденную по ссылке. - person Brad Allred; 24.04.2014
comment
да, это, безусловно, самое близкое к ответу, который я, вероятно, получу (пока, возможно, сами Apple что-то не сделают с этим). Принятый. - person Brad Allred; 28.04.2014
comment
Мне очень любопытно, будет ли это принято в магазине приложений. - person uchuugaka; 23.09.2014
comment
@uchuugaka Я думаю, что, вероятно, будет, хотя мы используем частный API для создания внешнего вида, при загрузке внешнего вида используются только общедоступные API ... - person Guilherme Rambo; 01.10.2014
comment
Интересно, есть ли какие-то побочные эффекты, какой-то аспект внешности отсутствует или неучтен. Это увлекательно. Но у меня такое чувство, что они не сделают это публичным. - person uchuugaka; 01.10.2014
comment
Является ли AppearanceMaker устаревшим в High Sierra? Это не работает. После выбора элементов пользовательского интерфейса при нажатии кнопки «Настроить» Photoshop не открывается. - person DerrickHo328; 05.06.2018

РЕДАКТИРОВАТЬ: ответ Гильерме более точен, хотя до сих пор нет общедоступного способа изменить внешний вид, как в iOS.

NSAppearance не очень похож на UIAppearance (насколько я могу судить), он касается только наличия элементов управления в обычном или светлом цвете. Примером этого может быть, когда вы рисуете во всплывающем окне (свет) или, возможно, на панели инструментов окна (обычно), NSAppearance позволяет вам определить, в какой среде вы рисуете. Честно говоря, я еще не использовал его, но большая часть информации, которую я нашел, была в видео WWDC 2013 о том, что нового в Cocoa и примечания к выпуску 10.9

Насколько я понимаю, это позволяет указать, как выглядит элемент управления на определенном фоне. Если используемый вами элемент управления будет использоваться повторно на другом фоне, вы можете проверить текущий внешний вид и соответствующим образом нарисовать элемент управления, используя [NSAppearance currentAppearance]

Еще одна важная часть заключается в том, что существует новый протокол, который могут принять ваши представления или окна, который называется протокол NSAppearanceCustomization, который позволяет указать внешний вид этого представления. Не совсем уверен, как это работает, но это там. Некоторые элементы управления Cocoa также реализованы, что обсуждается в HIG для элементов управления.

Есть 2 вида, которые определяет Apple, но вы можете определить свои собственные, используя свои собственные строки (опять же, не уверен). В нижней части документов, на которые вы ссылаетесь, вы найдете эти две константы:

APPKIT_EXTERN NSString *const NSAppearanceNameAqua;
APPKIT_EXTERN NSString *const NSAppearanceNameLightContent;

Так что это не UIAppearance, это просто способ узнать, на каком типе фона вы рисуете.

person Lucas Derraugh    schedule 05.11.2013
comment
Спасибо, я даю +1 за ссылку HIG, которая объясняет разницу между NSAppearanceNameLightContent и NSAppearanceNameAqua, но мой вопрос касается файлов внешнего вида, на которые есть ссылки в документах. В нем говорится не только о создании собственных, но и о нескольких общедоступных в классе методах, предназначенных для загрузки одного из пакетов приложений (а не встроенных). - person Brad Allred; 05.11.2013
comment
@BradAllred Я посмотрю, смогу ли я когда-нибудь получить рабочий пример. Для него нет образца кода, поэтому трудно точно сказать, как вы будете его использовать. Я согласен, хотя, похоже, вы могли бы создать свой собственный объект NSAppearance, но я не уверен, как это будет использоваться в IB. - person Lucas Derraugh; 05.11.2013