首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个故事板,用于管理retina 4和retina 3.5

多个故事板,用于管理retina 4和retina 3.5
EN

Stack Overflow用户
提问于 2013-06-11 17:11:47
回答 2查看 2.8K关注 0票数 1

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

代码语言:javascript
复制
MainStoryboard.storyboard
MainStoryboardiPhone5.stroryboard

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

代码语言:javascript
复制
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

为了检测显示器的大小,我在web上创建了以下代码:

代码语言:javascript
复制
    - (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时,我应该只找到一种方法来调用不同的故事板。我应该怎么做才能调用正确的故事板?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-11 17:17:28

iPhone 5的屏幕高度为568。

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

代码语言:javascript
复制
#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON)

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

代码语言:javascript
复制
- (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;
}

更新:

使用以下宏

代码语言:javascript
复制
// 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]

现在在您的应用程序代理

代码语言:javascript
复制
- (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

票数 11
EN

Stack Overflow用户

发布于 2013-06-11 17:29:26

我知道这并不是你真正想要的,但是使用AutoLayout是非常值得的。除非你的视图有很大的不同(例如,使用不同的图形,等等),AutoLayout可以通过重新排列的方式来处理几乎任何事情。这是一个棘手的开始,因为它并不真的为你的布局项目使用静态位置,它的工作原理是告诉它你的意图是如何相对于其他所有东西(superview,其他项目,等等)来放置东西。在线查看一些教程(Ray Wenderlich's one非常好)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17040406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档