如何为NSAppearance制作“外观文件”?

时间:2013-11-05 01:40:36

标签: objective-c cocoa osx-mavericks

我正在阅读Cocoa文档,并偶然发现了10.9 API中的一些新功能。

From the docs我认为NSAppearance类和相关协议NSAppearanceCustomization似乎是一种自定义NSView及其后代外观的方法。

  

NSAppearance对象表示一个文件,该文件指定应用于应用程序中UI元素子集的标准或自定义外观。应用程序可以包含多个外观文件,并且 - 因为NSAppearance符合NSCoding - 您可以使用Interface Builder将UI元素分配给外观。
  通常,您可以通过使用Xcode自定义窗口,以创建包含要自定义的视图和应该应用于它们的自定义艺术的外观文件。 Xcode将文件的艺术内容转换为AppKit在显示指定视图时可以绘制的运行时格式。

嗯,所有听起来都很整洁和有希望,但在文档中没有任何地方可以找到外观文件是什么或如何制作一个。除了我已经阅读过的精简文档之外,谷歌的搜索空无一人。

我确实看到UIKit有类似的声音UIAppearance类,但据我所知,这不是UIKit类的直接端口。

有人知道如何制作其中一个神奇的“外观文件”以及我们能用它们做些什么吗?

2 个答案:

答案 0 :(得分:10)

有一个名为“CoreThemeDefinition”的私有框架可以处理uicatalog文件,这些文件可以转换成“.car”文件并使用NSAppearance加载。我个人认为Apple将来会在Xcode中包含一个编辑器,但是现在你可以使用我制作的这个小工具:https://github.com/insidegui/AppearanceMaker

首先打开应用程序并选择保存uicatalog文件的位置,然后单击“创建骨架”。这将导出包含控件默认图像的各种PSD,然后您可以使用该应用程序编辑它们,保存并导出汽车文件。

此文件需要包含在您应用的资源中,并使用以下方式加载此自定义外观:

[[NSAppearance alloc] initWithAppearanceNamed:@"Your-appearance-name" bundle:nil]

答案 1 :(得分:5)

编辑:Guilherme的反应更准确,尽管在iOS中仍然没有公开的方式来改变外观。

NSAppearance与UIAppearance不太相似(据我所知),它只涉及在正常或浅色外观下进行控制。一个例子是当您绘制一个popover(light)与一个窗口工具栏(正常)时,NSAppearance允许您识别您正在绘制的环境。老实说,我还没有使用它,但我发现的最多信息是在WWDC 2013视频中关于Cocoa的新功能和10.9 release notes

根据我的理解,它允许您指定控件在特定背景上的外观。如果您使用的控件要在其他背景上重复使用,则可以使用[NSAppearance currentAppearance]

检查当前外观并相应地绘制控件

另一个重要的部分是你的视图或窗口可以采用一种称为NSAppearanceCustomization protocol的新协议,它允许你指定视图的外观。不完全确定这是如何工作但它就在那里。一些Cocoa控件也实现了这些,这些都在HIG for Controls中进行了讨论。

Apple定义了两种外观,但您可以使用自己的字符串定义自己的外观(同样,不确定)。在您链接到的文档的底部,您将找到这两个常量:

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

所以这不是UIAppearance,它只是一种了解你正在绘制什么类型背景的方法。