如何为iPhone 4英寸和iPhone 3.5英寸加载单独的NIB文件?

时间:2013-01-03 17:39:11

标签: ios layout ios6 nib

如何为我的iPhone应用程序加载单独的nib文件,以检查用户是否拥有iPhone 5 / iPod Touch 4英寸屏幕而不是3.5英寸屏幕?

这是在init方法中完成的吗?

详情   - 我没有在整个应用程序中使用故事板。有一次我会使用故事板并从其中一个视图控制器调用它。 (有没有办法区分故事板?)

  • 我正在寻找一个在每个单独的viewController中初始化的解决方案......而不是我将放在仅运行一次的appdelegate中的东西。

  • Autolayout对我来说在很多情况下都不起作用。这些设计非常具有图形性,太多的空白区域让事情看起来很糟糕。

1 个答案:

答案 0 :(得分:3)

我找到了办法!

  • 我制作单独的nib文件,一个用于3.5英寸/ iPhone非视网膜,一个用于iPhone5
  • 我使用宏来检查当前手机是否是iPhone 5格式。 (1)
  • 对于正常的initWithNibName:bundle:我写了一个异常,以便它们不使用普通的初始化程序。我将其命名为“错误的初始化程序”
  • 我为viewController创建了一个新的指定初始化程序,命名为initForFormat:
  • 我使用我的宏并检查设备是否是iPhone 5。如果它是iphone5,那么我使用nib名称ViewControllerIphone5
  • 初始化

<强>宏 我从RayOfHope的https://stackoverflow.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 因此,当我从另一个视图Controller或appdelegate调用此DetailViewController时,我写道:

DetailViewController *detailViewController = [[DetailViewController alloc] initForLayout];