1

您好我正在尝试为 iPhone 5 和 iPhone 4/4s 开发应用程序。我在使用故事板时遇到了麻烦:我为 iPhone 4/4s 设计了故事板,但是当我在 iPhone 5 上尝试它时,我的 GUI 很糟糕……我在互联网上读到使用 2 个故事板的最简单的解决方案:一个用于视网膜 4 和一个用于视网膜 3.5。我想问你如何通过代码调用不同的故事板?我创建了 2 个故事板文件:

MainStoryboard.storyboard
MainStoryboardiPhone5.stroryboard

我在互联网上发现我应该获取设备的屏幕尺寸并加载不同的故事板,但我应该在哪里做呢?在 Appdelegate.m 方法中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

为了检测显示器的大小,我在网上创建了这段代码:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        if (screenBounds.size.height == 568) {
            NSLog(@"retina 4");
        } else {
            NSLog(@"retina 3.5");
        }
        return YES;
    }

现在,当我检测到视网膜 4 或视网膜 3.5 时,我应该只找到一种方法来调用不同的故事板。我应该怎么做才能调用正确的故事板?谢谢

4

2 回答 2

11

iPhone 5 的屏幕高度为 568。

你可以简单地使用这个宏来检查它的 iPhone 5:

#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON)

然后在您的 AppDelegate.m 中检查 iPhone 5 并加载特定的故事板。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIStoryboard *mainStoryboard = nil;
    if (IS_IPHONE_5) {
        mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboardiPhone5" bundle:nil];
    } 
    else {
        mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    }

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [mainStoryboard instantiateInitialViewController];
    [self.window makeKeyAndVisible];

    return YES;
}

更新:

使用以下宏

// Check if device is iPhone 5
#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON)

// Get the storyboard name according to the device
#define GET_STORYBOARD_NAME(controllerName) IS_IPHONE_5 ? controllerName : [NSString stringWithFormat:@"%@-iPhone4",controllerName]

现在在您的App Delegate中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIStoryboard * storyboard = [UIStoryboard storyboardWithName:GET_STORYBOARD_NAME(@"Main") bundle:nil];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [storyboard instantiateInitialViewController];
    [self.window makeKeyAndVisible];
    return YES;
}

笔记:

iPhone4 故事板名称始终应采用此格式

YourStoryboardName-iPhone4.storyboard

于 2013-06-11T09:17:28.020 回答
2

我知道这并不是您真正要问的,但坚持使用 AutoLayout 确实值得。除非您的视图如此不同(例如,使用不同的图形等),否则 AutoLayout 几乎可以通过重新排列东西来应对任何事情。开始时很棘手,因为它并没有真正为您的布局项目使用静态位置,它通过您告诉它您如何相对于其他所有事物(超级视图、其他项目等)放置事物的意图来工作。查看一些在线教程(Ray Wenderlich 的教程非常好)。

于 2013-06-11T09:29:25.863 回答