我必须在我的应用中添加对iPhone5的支持。目前,appdelegate使用的是一个UITabBarController的nib,以及这样的代码。工作正常。
[window addSubview:rootController.view];
[window makeKeyAndVisible];
rootController是UITabBarController的一个实例。
所以我为iPhone5创建了一个新的笔尖,并将代码更改为......
if ([self IsTall])
rootController = [[[UITabBarController alloc] initWithNibName:@"MainWindow_5" bundle:nil] autorelease];
else
rootController = [[[UITabBarController alloc] initWithNibName:@"MainWindow" bundle:nil] autorelease];
[window addSubview:rootController.view];
[window makeKeyAndVisible];
但是,这个代码的屏幕是空白的,就像nib没有加载一样。
如果我尝试这个,我会在屏幕上加载和显示正确的笔尖但是没有显示“更多”按钮,只显示前4个标签(tabBarController中有7个标签
if ([self IsTall])
rootController = [[rootController initWithNibName:@"MainWindow_5" bundle:nil] autorelease];
else
rootController = [[rootController initWithNibName:@"MainWindow" bundle:nil] autorelease];
[window addSubview:rootController.view];
[window makeKeyAndVisible];
我也试过......
if ([self IsTall])
[[NSBundle mainBundle] loadNibNamed:@"MainWindow_5" owner:rootController options:nil];
else
[[NSBundle mainBundle] loadNibNamed:@"MainWindow" owner:rootController options:nil];
但是这会导致在Main下的plist中声明的nib的tab按钮崩溃 “nib文件基本名称”设置。
非常感谢任何帮助。这让我困扰了几天。 亲切的问候 罗布。
答案 0 :(得分:0)
这是我使用的方法
+ (BOOL)isPad{
BOOL result = NO;
if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)]){
result = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
}
return result;
}
+ (BOOL) isPhone{
BOOL result = NO;
static NSString *model;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
model = [UIDevice currentDevice].model;
});
if ([model hasPrefix:@"iPhone"]){
result = YES;
}
return result;
}
+ (BOOL)isWidescreen{
BOOL result = NO;
static CGFloat ratio;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
CGSize size = [UIScreen mainScreen].bounds.size;
CGFloat numerator = MAX(size.height, size.width);
CGFloat denominator = MIN(size.height, size.width);
ratio = numerator / denominator;
});
if (ratio > 1.77 && ratio < 1.78){
result = YES;
}
return result;
}
然后我使用Define语句使它们更容易到达
#define IS_IPAD() [StaticContainer isPad]
#define IS_WIDESCREEN() [StaticContainer isWidescreen]
#define IS_IPHONE() [StaticContainer isPhone]
我还有一个UIViewController类别
@implementation UIViewController (initHelpers)
- (id) initClassDevice{
NSString *device = @"";
if (IS_IPAD()) {
device = @"iPad";
}
else if (IS_WIDESCREEN()){
device = @"iPhone5";
}
else {
device = @"iPhone";
}
NSString *nibName = [NSString stringWithFormat:@"%@_%@",[self class],device];
self = [self initWithNibName:nibName bundle:nil];
return self;
}
@end
您需要为每个包含不同项目的nib文件。他们需要分别连接到所有东西。
我目前只将iphone和ipad分开,所以我想拥有一个视频控制器
MyMagicViewController.h / MyMagicViewController.m
和我将拥有的xib文件
MyMagicViewController_iPad.xib,MyMagicViewController_iPhone5.xib和MyMagicViewController_iPhone.xib
重要的是匹配xib文件的名称和对initWithNibName的调用:
还有另一件事要想。是您正在初始化的视图需要与它进入的视图大小相同。
view.frame = superView.bounds;
那么它将适合
答案 1 :(得分:0)
其他想法:
iPhone 5是iOS 6.您的应用之前是否在iOS 6下运行?如果没有,请让它适用于iOS 6 首先。即使没有进行其他更改,我的应用程序在与iOS 6链接时也显示为空白。那是因为视图控制器以完全不同的方式工作。因此,第一步是为iOS 6提供简单的启动行为。如果你正在推出景观,那么尤其如此;在这方面,一切都完全改变了。
不要自己添加子视图。只需设置窗口rootViewController
即可。它为您添加了子视图。
总的来说,在任何情况下都不应该加载不同的笔尖。您应该使用布局来布局相同的界面,使屏幕高度无关紧要。
希望那里的东西会有所帮助...
您的第二个代码完全违法。绝不会永远不会说“init”,除非在你刚才说“alloc”的同一行(当然,除了在初始化程序中)。
答案 2 :(得分:0)
我将Default-568h@2x.png添加到我的项目中解决了它。