您好我正在尝试为iPhone 5和iPhone 4/4开发应用程序。我在使用故事板时遇到了麻烦:我为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时,我只能找到一种方法来调用不同的故事板。 我该怎么做来调用正确的故事板? 谢谢
答案 0 :(得分: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
答案 1 :(得分:2)
我知道这不是你所要求的,但是使用AutoLayout确实值得坚持。除非你的观点如此不同(例如,使用不同的图形等),AutoLayout可以通过重新排列东西来处理几乎任何事情。这一点很棘手,因为它并没有真正使用静态位置作为你的布局项目,它的工作原理是你告诉它你如何把东西放在相对于其他东西(superview,其他项目等)的意图。在线查看一些教程(Ray Wenderlich's一个非常好)。