Chameleon 是将 Apple 的 UIKit(和一些相关的最小框架)移植到 Mac OS X 的项目。它的目的是尽可能成为真实 UIKit 的直接替代品。它还适配了一些 iOS 用户界面约定(例如,UIAlertView 由 NSAlert 表示)以确保使用 Chameleon 开发的应用尽可能在桌面上有良好体验,并且最小化移植工作量。
Chameleon 需要 OS X 10.6 或更高版本。使用它构建的应用经证实对 Apple 的 Mac App Store 是可接受的。Chameleon 最初由 The Iconfactory 为统一 Twitterrific 在 Mac 和 iOS 上的代码基础而构建。
UIKit 实现主要针对 iOS 3.2 的 UIKit 版本。目前并不是所有内容都得到了实现,但一个相当大的子集已经实现。同时,还实现了 iOS 后续版本的一些方法和/或行为。iOS 3.2 附近弃用的任何 UIKit 方法都没有包含在内。
作为一名通则,如果 Apple 的 UIKit 对一些代码块表现出了特定的行为,那么这一行为应该被认为是正确的,即使你不喜欢 Apple 版本的做法。如果 Chameleon 的行为不同,则 Chameleon 是错误的。但是,在把问题立即归咎于 Chameleon 之前,请务必确认你的代码确实在不同的情况下表现不同,同时也确保没有合理的原因导致 Chameleon 的行为不同。(意图上的差异示例是 UIAlertView 的行为 - 在 Apple 的 UIKit 中,它是一个 UIView,并且作为结果具有某些预期的行为和功能。在 Chameleon 中,它仍然是一个 UIView,但以 NSAlert 的形式呈现,这是为了实现更本地的外观和体验,但也意味着可能曾与 iOS 上的 UIAlertView 一起工作的一些 UIView 技巧在 Chameleon 下可能不起作用。UIActionSheet 和 UITextView 是其他有时存在较大但故意存在差异的示例。)
Chameleon 实际上是一个包含几个框架的集合,其中最大的框架是 UIKit。其他大多是空白框架,这使得将简单的示例代码和测试应用从 iOS 移植到 iOS 变得非常简单,代码更改量最小(在某些情况下甚至为零),对你来说可能有必要或没有必要。
生成的 Xcode 项目构建了可嵌入的框架,然后可以将其打包到您的应用捆绑包中并独立分发。
Chameleon 中的 UIKit 移植从非常底层开始,试图甚至通过将 UIEvent 对象在相似路径上路由来做到这一点,从单个 UIApplication 实例开始,并从那里传递到正确的 UIWindows 和 UIViews。
AppKit的NSView与NSWindow以及Chameleon的UIWindow和UIView之间的接口在“屏幕”级别实现。UIKitView是一个NSView,您可以根据需要将其添加到NSView层级中。UIKitView托管一个UIScreen实例,UIKit的用户界面元素都在该实例中。
每个UIWindow属于一个UIScreen,UIView必须存在于UIWindows上。这通常应该与您在iOS上期望的方式相同。需要注意的是,Mac应用程序通常会有多个窗口。如果您在应用程序中使用多个UIKitView,请注意这意味着您的应用程序现在有多个UIScreen,因此一些方法,如[UIScreen mainScreen],可能会突然表现出意外的行为。在将Twitterrific从iOS移植过来时,这曾是意外错误的一个来源,因为有些东西假设只有一个主屏幕,这是当前iOS设备中的正常情况。
一旦存在UIKitView并且有可用的UIScreen进行操作,您的代码就可以继续在 UIKitView 上构建 UIWindow 和 UIViews,并基本不会意识到它实际运行的是OSX而不是iOS。对于需要自定义UI的案例,已经添加了 UIUserInterfaceIdiomDesktop
,以便您的代码可以一致地区分在不同平台上运行:平板电脑、手机或桌面。为了保持代码跨平台一致性,以下是在编译时包含 UIKit.h
标准头文件但未包含 UIUserInterfaceIdiomDesktop
符号的编译方式。
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
// iPhone
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// iPad
} else {
// Mac
}
(您也可以使用#ifdef或其他编译时方法进行平台区分 - 特别是因为使用Chameleon构建的Mac应用程序在运行时不必要适应多个UI Idioms,就像通用的iOS应用程序一样。我只是觉得对于所有3种idimads拥有类似的模式很好 - 但可能这只是我的看法。)
您通常可以创建iOS应用程序的UIApplicationDelegate对象的实例,然后将其传递给UIKitView的辅助方法-launchApplicationWithDelegate:afterDelay:
,该方法将模拟iOS应用程序的启动过程(如果在延迟后给出,它甚至将尝试显示Default.png)。您可以在NSApplicationDelegate对象的-applicationDidFinishLaunching:
方法中执行此操作。使用UIKitView的辅助方法“启动”应用程序并非必要,但这可以是一个很好的起点。
类接口通常与Apple的文档接口相同。一些对象有一些对OS X有用的额外方法,它们在(ClassName)AppKitIntegration.h
头文件中定义,这些头文件不包括在标准的UIKit.h
头文件中。要轻松地将所有AppKit扩展添加到您的代码中,请在OSX上编译时包含UIKit/AppKitIntegration.h
。还有一些非标准的UI类定义,如UIKey和UIViewAdapter,它们是出于必要而设计的。(特别是键盘处理是Apple当前UIKit的弱点,因此我开发了定制的API,作为Apple“官方”未在文档中记录的任何东西的替代。)
目前几乎没有什么演示、示例或文档。在Examples文件夹中有一个名为BigApple的简单应用程序,这可能足够您开始。它还展示了如何将UIKit Xcode项目引用到另一个Xcode项目中,并设置为一个依赖项,以便在构建BigApple项目时自动构建。
Chameleon项目是由The Iconfactory的Sean Heber(Twitter: @BigZaphod)创建的,他花了数月时间写下了大部分初始版本。Craig Hockenberry(Twitter: @chockenberry)是Chameleon的第一个用户/测试者,他发现了第一版实现中的许多漏洞和边缘情况。
版权(c)2011,The Iconfactory。保留所有权利。
允许以源代码和二进制形式重新分发和使用,无论是否修改,前提是满足以下条件
源代码重新分发必须保留上述版权声明、本条款和以下免责声明。
以二进制形式的重新分发必须在学习资料或随分发提供的其他材料中复制上述版权声明、本条款和以下免责声明。
未经事先书面许可,不得使用 The Iconfactory 或其贡献者的名字来宣传或推广由此软件派生出的产品。
本软件由版权所有者和贡献者“按原样”提供,不承担任何明示或暗示的保证,包括但不限于适销性和适用于特定目的的隐含保证。在任何情况下,图标工厂不对因使用本软件而产生的直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,即使已告知此类损害的可能性。