通用应用 - 如何?

Hem*_*ema 1 ios xcode4.2

我正在使用Xcode 4.2并在编写通用应用程序的过程中.我从一个新项目开始时选择了SingleView Application模板.XCode添加了ViewController1.h,ViewController1.m,ViewController1_iphone.xib和ViewController1_iPad.xib.我需要添加更多UI并单击File ... New ... New File并选择UIViewController subClass模板并看到两个复选框(针对iPad,使用Xib进行用户界面).

我应该怎么做才能支持iPad和iPhone,同时拥有共享相同代码的常见.h和.m文件.我是否需要在视图控制器中添加代码以检查它是iPad还是iPhone?

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
} else {
}
Run Code Online (Sandbox Code Playgroud)

另外,我看到有人在谈论~iPad和~iPhone.这是怎么回事?

如果我理解正确,由于屏幕尺寸不同,我是否必须分别为iPad和iPhone设计UI?

我在这里完全糊涂了.

请帮忙.

rob*_*off 6

您可以添加两个笔尖(一个用于ipad,一个用于iphone),或者您可以添加一个笔尖,以便适当缩放任一界面.通常你会添加两个笔尖,如果你正在制作一个可以覆盖所有或大部分屏幕的视图,你可以添加一个笔尖,如果你正在做一些小的,可能是在iphone上全屏但显示在在ipad上的popover.

代字号后缀~ipad,资源编程指南的 "iOS支持特定于设备的资源"~iphone标题下描述.请注意,后缀完全是小写的,而不是你在问题中写的驼峰式的.这很重要,因为iOS使用区分大小写的文件系统.

当您使用或等NSBundle消息获取资源的路径时,iOS将首先查找后缀为或的资源文件,具体取决于当前设备.例如,假设你这样做:-[NSBundle pathForResource:ofType:]-[NSBundle URLForResource:withExtension:]~ipad~iphone

NSString *path = [[NSBundle mainBundle] pathForResource:@"setup" ofType:@"plist"];
Run Code Online (Sandbox Code Playgroud)
  • 如果您在iPhone类型的设备(包括iPod touch)上或在iPhone模式下的模拟器上运行此操作,iOS将首先在您的应用程序包中查找名为的文件setup~iphone.plist.如果找到这样的文件,它将返回该文件的路径.如果找不到该文件,它将返回路径setup.plist.

  • 如果您在iPad类型的设备上,或在iPad模式下的模拟器上,iOS将首先在您的应用程序包中查找名为的文件setup~ipad.plist.如果找到这样的文件,它将返回该文件的路径.如果找不到该文件,它将返回路径setup.plist.

从bundle获取资源的所有其他API都是建立在其上的NSBundle,因此它们都可以从特定于设备的查找中受益.这意味着如果您使用+[UIImage imageNamed:],它将自动使用特定于设备的图像(如果您的捆绑中有一个).如果您使用-[NSBundle loadNibNamed:owner:options:],它将自动加载特定于设备的nib(.xib)文件(如果您的捆绑包中有一个).

如果您使用后缀,这将简化您的代码.如果您创建MyViewController~ipad.xib并且MyViewController~iphone.xib,您的应用会自动为当前设备加载正确的应用.您不必检查用户界面惯用语; NSBundle为你检查一下.(你也可以使用的名称MyViewController~ipad.xibMyViewController.xib与获得同样的效果.)

现在,你可能已经注意到,当你创建你的"万能"的项目时,Xcode给了名为您的项目文件ViewController1_iPhone.xibViewController1_iPad.xib,这也不能使用波浪号后缀,它包含的代码来看看用户界面成语并据此选择一个文件名.为什么通用项目模板会这样做?我不知道,但这是愚蠢的.我建议你修复文件名以使用波浪符号后缀并删除检查用户界面习语的代码.