回答中的代码很有帮助,但我需要一些更适合通用应用程序(iphone/ipad)的东西。
如果其他人需要同样的东西,这里有一些东西可以帮助你入门。
假设您使用 ios 的 nib/xib 命名标准为具有相同名称的 xib 的视图控制器构建了一个通用应用程序:
不提供名称时自动加载 xib 的两个内置默认值被传递给 initWithNibName:
- ExampleViewController.xib [当 nib 为 Retina 3.5 Full Screen 为经典布局 iphone 4/4s 等命名为空时,iphone 默认...]
- ExampleViewController~ipad.xib [ipad/ipad mini 默认当 nib 命名为空时]
现在假设您需要使用 Retina 4 全屏选项在 IB 中为 iphone 5/5s 自定义 xib,即,您不希望为任何 568h 设备显示 3.5 xib。
这是使用类别方法的自定义命名约定:
- ExampleViewController-568h.xib [当 Retina 4 全屏 (568h) 的 nib 名称为空时,iphone 非默认/自定义命名约定]
不要覆盖内置的命名默认值,而是使用类别来帮助为控制器设置正确的 xib。
https://gist.github.com/scottvrosenthal/4945884
ExampleViewController.m
#import "UIViewController+AppCategories.h"
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
nibNameOrNil = [UIViewController nibNamedForDevice:@"ExampleViewController"];
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Do any additional customization
}
return self;
}
UIViewController+AppCategories.h
#import <UIKit/UIKit.h>
@interface UIViewController (AppCategories)
+ (NSString*)nibNamedForDevice:(NSString*)name;
@end
UIViewController+AppCategories.m
// ExampleViewController.xib [iphone default when nib named empty for Retina 3.5 Full Screen]
// ExampleViewController-568h.xib [iphone custom naming convention when nib named empty for Retina 4 Full Screen (568h)]
// ExampleViewController~ipad.xib [ipad/ipad mini default when nib named empty]
#import "UIViewController+AppCategories.h"
@implementation UIViewController (AppCategories)
+ (NSString*)nibNamedForDevice:(NSString*)name
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
if ([UIScreen mainScreen].bounds.size.height == 568)
{
//Check if there's a path extension or not
if (name.pathExtension.length) {
name = [name stringByReplacingOccurrencesOfString: [NSString stringWithFormat:@".%@", name.pathExtension] withString: [NSString stringWithFormat:@"-568h.%@", name.pathExtension ]
];
} else {
name = [name stringByAppendingString:@"-568h"];
}
// if 568h nib is found
NSString *nibExists = [[NSBundle mainBundle] pathForResource:name ofType:@"nib"];
if (nibExists) {
return name;
}
}
}
// just default to ios universal app naming convention for xibs
return Nil;
}
@end