【问题标题】:xcode 4.5 how to pick storyboards at launchxcode 4.5 如何在启动时选择故事板
【发布时间】:2012-09-14 05:45:22
【问题描述】:

试图让我的应用同时适用于 iPhone 5 和 iPhone 4/4s。我尝试了“自动布局”,但似乎不适用于我的应用程序,还读到它在 iOS 5 中不受支持。自动布局在具有 UIScrollview 和在代码中重新调整大小的 UIPicker 的视图控制器上特别失败。拥有两个故事板,一个用于 4 英寸,一个用于 3.5 英寸。

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

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

  2. 如何更改“主情节提要”?

【问题讨论】:

标签: xcode storyboard uistoryboard xcode4.5


【解决方案1】:

这是一个很好的问题。

你需要做的是,

  1. 选择您当前的 4/4 故事板,转到文件,复制,然后给它一个 iPhone 5 特定的名称。 确保选中 Target 和您的应用名称。

  2. 接下来,您必须在情节提要中选择场景,并在属性检查器中将大小更改为 Retina 4 Full Screen。 这使您可以重新排列此显示的所有内容。

  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 步,请按照以下步骤操作。

  1. 转到项目目录并复制粘贴MainStoryboard.storyboard,并将新故事板重命名为MainStoryboard5.storyboard

  2. 通过右键单击 Project 并单击 Add Files to ....,将这个新故事板 MainStoryboard5.storyboard 添加到项目中(在 Xcode 中)

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

提示

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

【讨论】:

  • 谢谢。确保在运行项目之前添加了启动画面 :)
  • 我最近开发了另一个应用程序,并在情节提要中使用 4" 显示屏构建了所有内容。在 3.5" 显示屏上运行它时,如果您的 UI 元素锚定正确,所有内容都将适应该显示屏。有一个背景图像,我必须在一个类的 viewDidLoad 中编写一个 if 语句,使用上面的代码检查屏幕的高度。这会根据当前设备更改显示的图像,以确保图片在 3.5 英寸屏幕上显示时看起来不会被挤压。
  • 您可以通过单击文件->复制(Command+Shift+S)复制故事板,然后将其重命名为“storyboard_iPad.storyboard”,,不要忘记“.storyboard”扩展名
  • @fields.cage 我已经完全按照您所说的做了,但是我的项目出现在模拟器上并不完全是我在 iphone5 stoaryboard 中所做的,我检查了每一件事
  • 当我添加代码时,我收到一条错误消息,指出在“ViewController*”类型的对象上找不到属性“窗口”
【解决方案2】:

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

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

仅当您至少向应用程序添加了Default-568h@2x.png 启动图像时,这才有效。否则,这将始终返回 false。 (因为如果没有启动图像,屏幕会被黑框化)

要将情节提要设置为您的 iPhone 5 版本,您可能需要查看this question

【讨论】:

    【解决方案3】:

    我从 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];
            }
        }
    

    【讨论】:

      【解决方案4】:

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

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

      布尔测试来自Detect iphone 5 4" screen

      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 设备使用的默认情节提要,这将非常有效。如果您从头开始使用现有的非 Storyboard 项目,您可以这样做。

      #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]; 
      }
      

      当我现在开始一个项目时,我在故事板中设计 iPhone 3.5" 版本(如果我正在使用故事板),然后当我完成该设计时,我进入我的项目文件并找到故事板文件。因为故事板文件只是一个 XML 布局文件,我可以将该文件加载到我最喜欢的文本编辑器中并更改两个标签。

      将 iPhone 转换为 iPad

      1. 在文件顶部找到targetRuntime="iOS.CocoaTouch"
      2. 更改为 targetRuntime="iOS.CocoaTouch.iPad"
      3. 在文件底部添加广告,您可能会发现这个<simulatedScreenMetrics key="destination" type="retina4"/>
      4. 将此更改为<simulatedScreenMetrics key="destination"/>

      仅当您的主情节提要文件设置为 4 英寸 iPhone 屏幕时,才会显示最后一项。

      这里重要的是,如果您只将 iPhone 5 添加到现有项目中,您只需要第一次检查以覆盖默认值,并加载您的特殊情节提要文件。这确实使我不必在 iPhone 5 的代码中手动布局所有对象。

      【讨论】:

        【解决方案5】:

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

        1. 为 iPhone5 创建一个项目,其 Storyboard 名为 iPhone5_Storyboard。

        2. 关闭应用程序并在文件夹中克隆 Main 故事名为 iPhone5_Storyboard 并重命名为 iPhone4_Storyboard 不要忘记在 xcode 界面构建器中更改大小并重新排序所有对象。

        3. 如果您想要通用版本,则可选,在 xcode 中使用添加文件 并为 iPad 添加新的 Storyboard EMPTY 目标,打开 iphone5_storyboard 使用 CMD+A 并复制所有并粘贴到 Empty 适用于 iPad 的故事(需要重新排序对象,但所有对象都已链接并正常工作)。

        4. 在 Xcode 中的 TARGET 下设置 Universal App 并在 MainStoryboard 下设置 iPhone5_Storyboard,在 iPad Main Story 下设置 iPad_Storyboard。

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

        - (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 Mini 和 Retina 的通用应用程序

        谢谢大家

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-22
          • 1970-01-01
          • 1970-01-01
          • 2015-01-20
          • 1970-01-01
          • 2014-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多