0

我必须在我的应用程序中添加对 iPhone5 的支持。目前,appdelegate 使用一个 nib,它是一个 UITabBarController,和这样的代码。工作正常。

[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];

但是,这段代码的屏幕是空白的,就像笔尖没有加载一样。

如果我尝试这个,我会在屏幕上加载和显示正确的笔尖,但没有显示“更多”按钮,只显示前 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];

但这会导致未在主要“nib 文件基本名称”设置下的 plist 中声明的 nib 的选项卡按钮崩溃。

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

4

3 回答 3

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 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;

然后它会合适

于 2013-01-02T22:36:25.093 回答
0

各种想法:

iPhone 5 是 iOS 6。您的应用程序之前是否在 iOS 6 下运行?如果没有,请先让它在 iOS 6 上运行。即使没有进行其他更改,我的应用程序在与 iOS 6 链接时也是空白的。那是因为视图控制器以完全不同的方式工作。因此,第一步是为 iOS 6 简化启动操作。如果您要启动横向应用程序,则尤其如此;在这方面,一切都完全改变了。

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

总的来说,无论如何你都不应该加载不同的笔尖。您应该使用布局来布置相同的界面,以使屏幕高不高无关紧要。

希望里面的东西会有所帮助...

你的第二个代码是完全非法的。永远不要永远不要说“init”,除非在您刚刚说“alloc”的同一行中(当然,在初始化程序中除外)。

于 2013-01-02T22:38:42.993 回答
0

对我来说,将 Default-568h@2x.png 添加到我的项目中解决了它。

于 2013-02-25T19:36:12.513 回答