加载支持iPhone5的备用UITabBarController

加载支持iPhone5的备用UITabBarController,iphone,ios,uitabbarcontroller,Iphone,Ios,Uitabbarcontroller,我必须在我的应用程序中添加对iPhone5的支持。目前,appdelegate使用的nib是UITabBarController,代码如下。很好 [window addSubview:rootController.view]; [window makeKeyAndVisible]; rootController是UITabBarController的一个实例 所以我为iPhone5创建了一个新的nib,并将代码更改为 if ([self IsTall]) rootController

我必须在我的应用程序中添加对iPhone5的支持。目前,appdelegate使用的nib是UITabBarController,代码如下。很好

[window addSubview:rootController.view];
[window makeKeyAndVisible];
rootController是UITabBarController的一个实例

所以我为iPhone5创建了一个新的nib,并将代码更改为

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];
但这会导致未在主目录下的plist中声明的nib的选项卡按钮崩溃 “nib文件基本名称”设置

非常感谢您的帮助。这已经困扰了我好几天了。 问候
罗伯。

这是我使用的方法

+ (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;
}
我还有一个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;

然后它将适当地适合各种想法:

iPhone 5是iOS 6。你的应用程序以前在iOS 6下工作过吗?如果没有,请先让它在iOS 6下工作。我的应用程序在与iOS 6链接时显示为空白,即使没有其他更改。这是因为视图控制器的工作方式完全不同。因此,第一步是为iOS 6完成简单的启动操作。我尤其如此如果你正在进入风景区,在这方面一切都完全改变了

不要自己添加子视图。只需设置窗口的
rootViewController
。它会为您添加子视图

总的来说,在任何情况下,你都不应该加载不同的nib。你应该使用布局来布局相同的界面,这样不管屏幕是否高

希望里面的东西能帮上忙


你的第二个代码是完全非法的。除了在你刚才说“alloc”的同一行之外,千万不要说“init”(当然,在初始值设定项中除外)。

我添加默认值-568h@2x.png我的项目解决了它。

谢谢你的回复。是的,应用程序在iOS6上工作很好。问题是我需要支持iO3+(我知道这是一个真正的痛苦)因此,自动布局工具无法工作到目前为止,所以据我所知,双笔尖是唯一的选择?有待更正。是的,我知道没有alloc的init是非法的,但它显示了一些东西!如果我只是更新我的iPhone应用程序(即加载)Default@2x.png)它工作了,所有的东西都被推上了,但是tabBar按钮不起作用。如果我能解决这个问题,那么这可能就足够了??再次感谢你的回复。我没有说自动布局。我说的是布局。除了自动布局之外,还有两种其他类型的布局,它们可以追溯到iOS 3。是的,这就是我要做的。我已经弄明白了,会的如果我需要iP5视图,请将其调整为单个布局,并使用代码移动一些内容。感谢您的提示,这让我走到了正确的方向。干杯。感谢您的评论。非常感谢。我只是使用UIAbbarController作为类,而不是将其子类化。我认为将UIAbbarController子类化是个坏主意。我可能需要创建两个UIViewControllers以您的方式完成。值得思考。一定有更简单的方法吗?谢谢!我通常让第一页是一个与应用程序无关的视图控制器。一个带有根控制器(即启动屏幕)的导航控制器。然后在启动屏幕中,我通过initClassDevice命令推送我的新视图控制器以获得e正确的笔尖。是的,很好的计划。可能是比我现在的应用程序更好的方法。但是我会使用一个笔尖,并根据需要在代码中调整布局。为你的帮助欢呼!
view.frame = superView.bounds;