加载替代UITabBarController以支持iPhone5

时间:2013-01-02 22:29:19

标签: iphone ios uitabbarcontroller

我必须在我的应用中添加对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文件基本名称”设置。

非常感谢任何帮助。这让我困扰了几天。 亲切的问候 罗布。

3 个答案:

答案 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添加到我的项目中解决了它。