iPhone 6有一个不同的故事板吗?
iPhone 6有一个不同的故事板吗?
当我们拥有iPhone 4和5时,我们检查了屏幕尺寸,并为每个iPhone制作了2个storyboard。
//iPhone 4
如果(height == 480)
{
storyboard = [UIStoryboard storyboardWithName:@"StoryboardiPhone" bundle:nil];
NSLog(@"设备具有3.5英寸显示屏。");
}
//iPhone 5
else if(height == 568)
{
storyboard = [UIStoryboard storyboardWithName:@"StoryboardiPhone5" bundle:nil];
NSLog(@"设备具有4英寸显示屏。");
}
//iPad
else
{
storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
NSLog(@"设备具有iPad显示屏");
}
现在又有了2款新的iPhone,问题是,是否正确为所有iPhone和iPad制作5个storyboard?对我来说似乎是错误的做法,但我找不到一种方法来在一个设备上安排视图,并使其适应所有其他设备 - 并确保它始终正常工作。
现在应该采取什么正确的方法?
(iPhone 6 a different storyboard?)是一个问题,它的出现原因是需要为不同的尺寸类别设计不同的UI界面,而之前的代码根据设备选择要加载的故事板,现在不再需要这样做了。解决方法是在Interface Builder中为wAny/hAny的尺寸类别设计UI界面,并应用自动布局约束来描述视图如何适应不同的尺寸类别。如果需要,可以为特定的尺寸类别覆盖一些约束。另外,建议观看一段介绍自适应UI和尺寸类别的WWDC视频。然而,有时候尺寸类别无法满足某些需求,比如苹果在提交应用时要求兼容3.5英寸的显示屏(截至目前为止)。对于iPhone 4来说,适用于iPhone 5到6+的自动布局会导致太多的拥挤。
使用AutoLayout是最佳方法,但如果由于某种原因仍然需要在不同的屏幕尺寸上使用不同的storyboard,可以使用以下代码进行实现。
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) { //iPad storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; }else{ if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone){ // The iOS device = iPhone or iPod Touch CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size; if (iOSDeviceScreenSize.height == 480){ // iPhone 3/4x storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone3_4X" bundle:nil]; }else if (iOSDeviceScreenSize.height == 568){ // iPhone 5 - 5s - 4 inch storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5_5S" bundle:nil]; }else if (iOSDeviceScreenSize.height == 667){ // iPhone 6 4.7 inch storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil]; } else if (iOSDeviceScreenSize.height == 736){ // iPhone 6 Plus 5.5 inch storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6Plus" bundle:nil]; } } }
为了支持iPhone 6和iPhone 6 Plus的屏幕分辨率,需要添加启动图像。
此方法在iOS7/8以上版本中不推荐使用,建议使用AutoLayout代替。