xcode 4.5如何在发布时select故事板

试图使我的应用程序与iPhone 5和iPhone 4 / 4s一起工作。 我尝试了“AutoLayout”,但似乎并没有为我的应用程序工作也读取,它不支持在iOS 5中。AutoLayout具体失败的视图控制器有一个UIScrollview和UIPicker在代码中重新resize。 有两个故事板一个4英寸,一个3.5英寸似乎要走的路。

这两个Storyboard aproch似乎是我的解决scheme。 所以这给我留下了两个问题。

  1. 代码在哪里检测,然后如果是4 / 4s / 5去? 我会假设在didFinishLaunchingWithOptions方法中的appDelegate.m

  2. 我如何更改“主要故事板”?

这是一个很好的问题。

你需要做的是,

  1. select你当前的4/4故事板,去文件,复制,然后给它一个iPhone 5的具体名称。 确保Target和您的应用程序名称被选中。

  2. 接下来,您必须select故事板中的场景,并在“属性”检查器中将大小更改为Retina 4全屏。 这使您可以重新排列此显示的所有内容。

  3. 最后在应用程序didFinishLaunchingWithOptions粘贴下面的代码与您为4英寸故事板提供的故事板名称。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ UIStoryboard *storyBoard; CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width * scale, result.height * scale); if(result.height == 1136){ storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_5" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } } return YES; } 

如果有人不知道如何做第一步,请按照以下步骤操作。

  1. 转到项目目录并复制粘贴MainStoryboard.storyboard并重命名新的故事板来说MainStoryboard5.storyboard

  2. 通过右键单击“项目”并单击“ Add Files to ....在项目中添加新的故事板MainStoryboard5.storyboard (在Xcode中)。

  3. 现在我们有两个xcode的故事板。

小费

完成上述所有操作后,您可能需要使用“产品>清洁”才能使用。

目前唯一的方法是检查你使用的是iPhone 5的[UIScreen mainScreen] bounds][[UIScreen mainScreen] scale]

 BOOL isIphone5 = (([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) && (([UIScreen mainScreen].bounds.size.height * [[UIScreen mainScreen] scale]) >= 1136)); 

这只有在您至less添加了一个Default-568h@2x.png启动图像到您的应用程序。 否则这将始终返回false。 (因为如果您没有启动图像,屏幕将被置信箱)

要设置故事板到你的iPhone 5版本,你可能想看看这个问题

我在fields.cage上获取灵感,并将其改编为我的代码,它工作正常。 谢谢 !!

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ UIStoryboard *storyBoard; CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width * scale, result.height * scale); if(result.height == 1136){ self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone5" bundle:nil] autorelease]; } else { self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease]; } } 

我最近做的是在任何需要检查设备的类中添加一个定义语句。 这也可以在任何全局头文件中完成。

 #define IS_IPHONE (!IS_IPAD) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) 

布尔testing是从检测iPhone 5 4“屏幕 。

 bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136)); if (isiPhone5) { // Setup For iPhone 5 Screen Size UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MyiPhone5StoryboardName" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } 

如果您已经在使用故事板 ,并且只想从您的项目为iPhone 5设备启动的默认设置中更改故事板则此function非常精美 。 如果您从现有的非故事板项目开始,可以这样做。

 #define IS_IPHONE (!IS_IPAD) #define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone) bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136)); if (isiPhone5) { // Load iPhone 5 Storyboard UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } else if (IS_IPAD) { // Load IPAD StoryBoard UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } else { // Load the iPhone 3.5" storyboard UIStoryboard *storyBoard; storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } 

当我开始一个项目,现在我devise的故事板的iPhone 3.5“版本(如果我使用故事板),那么当我完成了这个devise,我进入我的项目文件,并find故事板文件由于故事板文件只是一个XML布局文件,我可以把这个文件,并加载在我最喜欢的文本编辑器,并更改两个标签。

将iPhone转换为iPad

  1. 在文件顶部find targetRuntime="iOS.CocoaTouch
  2. 更改为targetRuntime="iOS.CocoaTouch.iPad"
  3. 广告底部的文件,你可能会发现这个<simulatedScreenMetrics key="destination" type="retina4"/>
  4. 将其更改为<simulatedScreenMetrics key="destination"/>

最后一个项目只有在您的主要故事板文件设置为4“iPhone屏幕时才会出现。

这里重要的是如果你只将iPhone 5添加到现有的项目,你只需要第一次检查来覆盖默认,并加载你的特殊故事板文件。 这从字面上保存我不必手动布局iPhone 5代码中的所有对象。

第一个工作非常好,简单明了,但是如果你想集成多个设备,请看这里:

  1. 使用名为iPhone5_Storyboard的Storyboard创build一个iPhone5项目。

  2. closures应用程序,并在文件夹内克隆名为iPhone5_Storyboard的主要故事,并重命名为iPhone4_Storyboard不要忘记更改大小,并重新排列xcode界面生成器内的所有对象。

  3. 可选如果你想要一个通用的版本,在Xcode里面使用添加文件和添加新的故事板EMPTY目标为iPad,运行un iphone5_storyboard使用CMD + A和复制全部并粘贴在iPad的空故事(需要重新sorting对象,但全部链接和工作)。

  4. 在TARGET下的Xcode中设置通用应用程序,并在MainStoryboard下设置iPhone5_Storyboard,在iPad Main Story设置iPad_Storyboard下。

  5. 现在感谢这篇文章的第一个答案,我们必须在AppDelegate.m中使用这个代码来实现所有不同的Story:

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

  if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){ UIStoryboard *storyBoard; CGSize result = [[UIScreen mainScreen] bounds].size; CGFloat scale = [UIScreen mainScreen].scale; result = CGSizeMake(result.width *scale, result.height *scale); //----------------HERE WE SETUP FOR IPHONE4/4s/iPod---------------------- if(result.height == 960){ storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } //----------------HERE WE SETUP FOR IPHONE3/3s/iPod---------------------- if(result.height == 480){ storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil]; UIViewController *initViewController = [storyBoard instantiateInitialViewController]; [self.window setRootViewController:initViewController]; } } return YES; } 

这就是现在我们有一个通用的应用程序的iPhone 3 / 3Gs / 4 / 4s / 5的iPod(AllGen的)的iPad 1/2/3/4迷你和视网膜

多谢你们