【问题标题】:Multiple storyboard to manage the retina 4 and retina 3.5多个故事板来管理视网膜 4 和视网膜 3.5
【发布时间】:2013-06-11 09:11:46
【问题描述】:

您好,我正在尝试为 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 时,我应该只找到一种方法来调用不同的故事板。 我应该怎么做才能调用正确的故事板? 谢谢

【问题讨论】:

    标签: iphone ios objective-c storyboard retina-display


    【解决方案1】:

    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]
    

    现在在您的应用代理

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

    【讨论】:

    • 好的,但我必须检测屏幕尺寸对吗?我这样检测到: if (screenBounds.size.height == 568) { NSLog("Retina 4"); } else { NSLog("Retina 3.5");你贴给我的代码不是检测IOS版本吗?我知道我只能使用 IOS 6 获取屏幕尺寸。
    • 是的,您需要...您的 NSLog 是否根据您的期望值打印出来
    • 我也应该使用你的解决方案并在 if 中添加对屏幕尺寸的检测对吗?
    【解决方案2】:

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

    【讨论】:

    • 同意。事实上,在向下滚动帖子之前,我也想知道同样的事情。我认为@somanman 有一个正确的观点。
    猜你喜欢
    • 2013-02-10
    • 2014-11-05
    • 2014-03-19
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多