如何为 iPhone 4 英寸和 iPhone 3.5 英寸加载单独的 NIB 文件?
Posted
技术标签:
【中文标题】如何为 iPhone 4 英寸和 iPhone 3.5 英寸加载单独的 NIB 文件?【英文标题】:How to load Separate NIB Files for iPhone 4-inch and iPhone 3.5 inch? 【发布时间】:2013-01-03 17:39:10 【问题描述】:如何为我的 iPhone 应用加载单独的 nib 文件,以检查用户是否拥有 iPhone 5/iPod Touch 4 英寸屏幕和 3.5 英寸屏幕?
这是在init方法中完成的吗?
详情 - 我没有为整个应用程序使用故事板。在某一时刻,我确实使用了故事板并从其中一个视图控制器中调用它。 (有没有办法区分情节提要?)
我正在寻找一种在每个单独的 viewController 中初始化的解决方案...而不是我会放入只运行一次的 appdelegate 的解决方案。
对我来说,自动布局在很多情况下都不起作用。这些设计非常图形化,太多的空白会让事情看起来很糟糕。
【问题讨论】:
【参考方案1】:我找到了方法!
我制作了单独的 nib 文件,一个用于 3.5 英寸/iPhone 非视网膜,一个用于 iPhone5 我使用宏来检查当前手机是否为 iPhone 5 格式。 (1) 对于普通的 initWithNibName:bundle: 我写了一个异常,以便他们不使用普通的初始化程序。我将其命名为@“错误的初始化程序” 我为 viewController 创建了一个新的指定初始化程序,将其命名为 initForFormat: 我使用宏检查设备是否为 iPhone 5。如果是 iphone5,那么我使用 nib 名称 ViewControllerIphone5 进行初始化宏 我从 RayOfHope 的https://***.com/a/13068238/1492368 得到这个宏
#define HEIGHT_IPHONE_5 568
#define IS_IPHONE ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5 )
所以在新指定的初始化器initForLayout中:我写
if(IS_IPHONE_5)
self=[super initWithNibName:@"DetailViewControlleriPhone5" bundle:nil];
else
self=[super initWithNibName:@"DetailViewController" bundle:nil];
旧初始化程序
我从 Big Nerd Ranch 学到了这一点: 使用标准初始化程序时抛出异常
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
@throw [NSException exceptionWithName:@"Wrong initializer"
reason:@"Use initForLayout:"
userInfo:nil];
return nil;
从另一个 ViewController/AppDelegate 调用 View Controller 所以当我从另一个视图控制器或我写的 appdelegate 调用这个 DetailViewController 时:
DetailViewController *detailViewController = [[DetailViewController alloc] initForLayout];
【讨论】:
以上是关于如何为 iPhone 4 英寸和 iPhone 3.5 英寸加载单独的 NIB 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 iPhone 6 / 6 Plus 仅横向应用程序创建启动图像?
如何使用 Xcode 4.5 为 iPhone 4 和 iPhone 5 创建 xib
你如何为设备和模拟器编译 PJSip iPhone 以在 iOS 3 和 iOS 4 上使用虹吸管?