我的应用程序最初是一款仅限 iPad 的应用程序。现在我将其转换为适合 iPhone 的较小版本。我使用的是相同的代码库,并且许多控制器实际上不需要进行太多更改 - 只是需要重新制作视图以适应较小的屏幕。这不是一个通用应用程序,因为 iPad 和 iPhone 版本之间的某些功能不同,并且 App Store 中的价格点也非常不同。
我添加了单独的目标,设备系列设置为 iPhone。原始目标将此设置为 iPad。
我重新制作了一堆笔尖,文件名遵循格式view~iphone.xib
,当我在 iPhone 上运行 iPhone 构建时,这些笔尖被正确加载,而不是原始的 iPad 笔尖(文件名采用格式view.xib
)。
问题是当我在 iPad 上运行iPhone版本时。正如您对 iPhone 应用程序所期望的那样,它在那个小的 iPhone 窗口中运行(可以加倍到 2 倍)。但加载的笔尖是iPad笔尖,显然不适合 iPhone 大小的显示器或调整其大小。我不明白为什么 iOS 不会自动加载 iPhone 版本。如果我测试UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
,它返回 false,所以它知道它在 iPhone 模式下运行!
鉴于我无法阻止客户在 iPad 上运行 iPhone 应用程序,我想让它正常工作。我尝试了一些事情,但它们似乎不正确:
- 将代码更改为
[[MyViewController alloc] initWithNibName:@"MyView~iphone" bundle:nil];
将加载正确的笔尖,但这意味着我必须在指定笔尖名称的所有位置周围放置条件代码 - 这是一个很大的应用程序,所以有很多,这可能容易出错将来当我或其他开发人员忘记在新代码中执行此操作时。 - 重命名所有
~iphone
笔尖以具有与 iPad 版本相同的文件名(即view.xib
),将它们移动到单独的目录中(这样它们不会与原件的名称冲突)并将它们重新添加回项目中,但仅包括在内在 iPhone 目标(而不是 iPad 目标)中,并从 iPhone 目标(但仍包含在 iPad 目标中)取消勾选原始 iPad 笔尖将导致在运行时加载正确的笔尖(因为“错误”笔尖没有每个构建的捆绑包中更长的时间),无论命名如何。请注意,如果我将文件名保留为view~iphone.xib
,那么当 iPhone 构建在 iPad 上运行时,尝试加载该笔尖时会出现异常:Could not load NIB in bundle
. 相同的文件名使这种方法非常不愉快,乍一看并不明显发生了什么。 - 在 iPad 上运行 iPhone 版本时,将原始 xib 重命名为
view~ipad.xib
(将 iPhone 笔尖命名为view~iphone.xib
)仍会导致加载 iPad 笔尖。
一定有比这两种方法更好的方法吗?当设备清楚地知道它正在运行 iPhone 应用程序时,为什么会加载错误的 (iPad) 笔尖?