【问题标题】:Converting Storyboard from iPhone to iPad将故事板从 iPhone 转换为 iPad
【发布时间】:2012-01-17 22:37:10
【问题描述】:

我有一个带有情节提要的iPhone 应用程序。现在我也想提供一个iPad 应用程序。所以我问我是否有一个函数可以帮助我将iPhone 故事板转换为iPad 故事板。

具体来说:

有类似的功能还是只有手动方式?

【问题讨论】:

  • 哦,谢谢,我不知道我必须标记它们,我现在将一个答案标记为正确答案。我也在我的旧线程中这样做了,谢谢。
  • datacalculation.blogspot.in/2014/09/…找到包含步骤和图像的详细信息

标签: ios iphone xcode ipad storyboard


【解决方案1】:

我找到了一种解决方案:

  1. 复制您的 iPhone 故事板并将其重命名为 MainStoryboard_iPad.storyboard

  2. 关闭 Xcode,然后在任何文本编辑器中打开此文件。

  3. 搜索targetRuntime="iOS.CocoaTouch"并将其更改为targetRuntime="iOS.CocoaTouch.iPad"

  4. 将 MainStoryboard_iPad.storyboard 中的代码更改为:

    <simulatedScreenMetrics key="destination" type="retina4"/>

    <simulatedScreenMetrics key="destination"/>

  5. 现在保存所有内容并重新打开 Xcode。 iPad-Storyboard 的内容与 iPhone-file 的内容相同,但所有内容都可能杂乱无章。

这为我节省了几个小时 - 希望这会对您有所帮助

【讨论】:

  • +1 如果可以的话,我会从我自己的声誉中给你+100。绝妙的建议!我唯一不能做的是用 Dashcode 打开故事板,所以我使用了 TextWrangler(但我认为任何文本编辑器都可以)。谢谢!
  • 好建议,谢谢。当您使用它时,您可能还想直接从这里将所有 width="320" 更改为 width="768"、height="480" 到 height="1024" 等。因为它比在 IB 中逐个元素地做要简单得多。
  • 不要使用 Dashcode,也不要 textWrangler,在 xCode 中简单地:右键单击情节提要 -> “打开为” -> “源代码” 完成后,除了使用“界面生成器”外,做同样的事情- IOS 故事板”
  • @PiotrJustyna 你可以做到。在问题下方按start a bounty,选择所需金额和Reward existing answer...
  • 要获取 iPad 格式,还将 MainStoryboard_iPad.storyboard 中的代码从:<simulatedScreenMetrics key="destination" type="retina4"/> 更改为 <simulatedScreenMetrics key="destination"/>
【解决方案2】:

如果您创建了一个通用项目,默认情况下会创建空的 iPad 故事板,您只需选择 iPhone 故事板全选 (Command+A),复制 (Command+C) 并将其粘贴到 iPad 故事板上。确保在编译之前将入口点从空故事板移动到新复制的故事板。

【讨论】:

  • 最佳答案,简单的解决方案,并允许您在事后轻松修改界面,这与最佳答案不同。 :)
  • 布局怎么样?
【解决方案3】:

这对我来说不太合适。我做了一些不同的事情。

  1. 为 iPad 版本创建一个新的故事板文件
  2. 在 textwrangler(文本编辑器)中打开新文件和我要复制的文件
  3. 将旧文件中的 xml 文本复制到这些 xml 标签之间的新文件中
  4. 第一个标签<scenes> <!--Contents View Controller-->
  5. 在此处粘贴
  6. 结束标签</class> </classes>

这对我有用。我得到了一个连接所有插座的新布局,仅此一项就为我节省了几个小时。

【讨论】:

  • +1 其他人没有为我工作,这使得一切都按预期工作
  • 您可以在 Xcode 中执行此操作。只需右键/控制单击.storyboard 文件并单击Open As > Source Code 即可查看原始XML。
【解决方案4】:

通过阅读stackoverflow上的许多线程,我发现解决方案是-

1.复制你的 iPhone-Storyboard 并将其重命名为 MainStoryboard_iPad.storyboard

2.右键故事板->“打开方式”->“源代码”。

3.搜索 targetRuntime="iOS.CocoaTouch" 并将其更改为 targetRuntime="iOS.CocoaTouch.iPad"

5.搜索<simulatedScreenMetrics key="destination" type="retina4"/>,改成<simulatedScreenMetrics key="destination"/>

4.现在保存所有内容并右键单击 MainStoryboard_iPad.storyboard “open as” -> “IOS StoryBoard” 5. 你可能还需要改变你的约束。 这就是你所做的一切。

【讨论】:

    【解决方案5】:
    1. Create New Storyboard file with MainStoryboard_iPad.storyboard
    2. Copy All the views from MainStoryboard and paste to MainStoryboard_iPad.storyboard
    

    【讨论】:

      【解决方案6】:

      1 - 创建您的"MainStoryboard_iPad.storyboard";

      2 - 右键单击​​您 "MainStoryboard_iPhone.storyboard" 和“打开为 -> 源代码”。复制所有内容;

      3- 右键单击​​您的 "MainStoryboard_iPad.storyboard" 和“打开为 -> 源代码”。粘贴所有内容。现在搜索和更改:

      • targetRuntime="iOS.CocoaTouch" to targetRuntime="iOS.CocoaTouch.iPad"
      • type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" to type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.iPad.XIB"

      4 - 保存。现在重新打开,但使用界面生成器。你只需要重新安排。

      这个方法也可以用于.xib文件

      【讨论】:

      • 这是最好的方法。因为所有的视图和组件都会被调整为 ipad 格式。
      • 最新版ios7无需更改type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB"。
      【解决方案7】:

      这是另一种方式,但我能够在我的 iPad 故事板(约 35 个场景)中进行全选并复制并将其粘贴到我的 iPhone 故事板中。场景大小是自动调整的。我只看到了两个问题,我不得不更换 UISplitViewController(因为它只是 iPad),并且默认背景变为透明而不是灰色(仍在努力正确修复,无需手动设置所有内容的背景)。

      编辑:似乎属性检查器中 UITableView 的默认背景相当奇怪。对于分组表视图,我必须手动将背景设置为“分组表视图背景颜色”,对于非分组表视图,我必须手动将背景设置为“白色”。然后它被显示为“默认”(我假设因为它匹配了一个硬编码的值)。 -- 实际上,更简单的是,从“分组”更改为“静态”并返回似乎重置了默认颜色。

      【讨论】:

        【解决方案8】:

        这里有一些东西可以节省我的时间,并且可能会帮助那些掌握 Python 技能的人。

        在过去的两个月里,我一直在构建一个应用程序,专注于 iPad 与团队一起迭代用户体验。

        今天专注于构建 iPhone 版本,按照上述步骤(谢谢!),但我不想在可视化故事板编辑器中调整 iPad 尺寸的所有 ui 元素。

        所以我编写了这个小的 python jig 脚本来扫描故事板文件中的 x、y、宽度、高度,并按比例 320./768 缩小所有内容。然后让我只专注于微调。

        1. 将您的 iPad 故事板复制到一个新文件中。 (例如 iPhoneStoryboard.storyboard)

        2. 使用复制的情节提要文件名作为第一个参数运行以下脚本。

        3. 将生成后缀为 _adjusted.storyboard 的输出文件(例如 iPhoneStoryboard.storyboard_adjusted.storyboard)

        希望对你有帮助...

        import re
        import sys
        import math
        
        afile = sys.argv[1]
        
        scale = 320./768.
        
        number_pattern = '[-0-9]+(.[0-9]+)?'
        #width_pattern = 'width="[-0-9]+( ?px)?"'
        width_pattern = 'width="[-0-9]+(.[0-9]+)?( ?px)?"'
        height_pattern = 'height="[-0-9]+(.[0-9]+)?( ?px)?"'
        x_pattern = 'x="[-0-9]+(.[0-9]+)?( ?px)?"'
        y_pattern = 'y="[-0-9]+(.[0-9]+)?( ?px)?"'
        
        
        def replacescaledvalue(scale,pattern,sometext,replacefmt) :
            ip = re.search(pattern, sometext, re.IGNORECASE)
            if(ip) :
                np = re.search(number_pattern,ip.group(0))
                if(np) :
                    val = float(np.group(0))
                    val = int(math.floor(val*scale))
                    sval = replacefmt+str(val)+'"'#+'px"'
                    newtext = re.sub(pattern,sval,sometext)
                    return newtext
            else :
                return sometext
        
        fin = open(afile)
        fout = open(afile+"_adjusted.storyboard", "wt")
        for line in fin:
            newline = line
            newline = replacescaledvalue(scale,width_pattern,newline,'width="')
            newline = replacescaledvalue(scale,height_pattern,newline, 'height="')
            newline = replacescaledvalue(scale,x_pattern,newline, 'x="')
            newline = replacescaledvalue(scale,y_pattern,newline, 'y="')
        #   print newline
            fout.write( newline )
        
        fin.close()
        fout.close()
        

        【讨论】:

        • 嗨,Chrish,我是 phython 的新手。所以我无法理解将 iphone 故事板更改为 iPad 的代码。所以你能帮我解决这个问题吗?我的 ipad 故事板正在转换为 iphone 故事板,没有任何问题。但我需要将我的 iphone 故事板转换为 iPad。因此,在上述脚本中需要更改的地方,或者您可以共享将 iphone 转换为 ipad 的脚本。提前致谢。
        • @Chris Robertson Chris,如果我想将此脚本用于 iPhone 到 iPad 的转换,我会更改“比例 = 320./768”吗?到“比例 = 768./320.”?
        【解决方案9】:

        对于 Xcode10

        1. 只需复制Main.storyboard

        2. 然后将文件重命名为Main_iPad.storyboardMain_iPone.storyboard

        3. .plist中设置适当的名称

        4.只需选择合适的 .storyboard 进行配置

        【讨论】:

          【解决方案10】:

          转到您的目标摘要并将设备更改为通用, 然后将 ipad 版本设置为您喜欢的任何故事板,如果您愿意,可以复制并重命名。

          【讨论】:

            【解决方案11】:

            作为对可能对此有疑问的人的快速提示:

            我的问题:

            故事板内容很好地复制到我添加的新板文件中。但是,它不会对我配置的 iPad 进行更改。注意到我必须为构建目标切换指定的故事板(见图)让更改显示出来。

            如果我有积分,我会发布图片,但设置位于:

            左侧源菜单上的项目导航器,项目的根目标(中心窗格)常规选项卡,(第二个子标题)部署信息,选中 iPad 按钮选项卡。

            从那里,在“主界面”下选择您的故事板。

            感谢您的帖子,我希望这个提及有助于某个地方的障碍。

            【讨论】:

              【解决方案12】:

              只是为了好玩,在 XCode 5.1 和 iOS 7.1 上,我还需要将“toolVersion”和“systemVersion”的值更改为:

              toolsVersion="5023" systemVersion="13A603"
              

              没有这个,新的故事板文件将无法编译

              【讨论】:

                【解决方案13】:

                使用 XCode6 Size Classes,您不再需要将情节提要转换为 iPad。 iPhone 和 iPad 都可以使用同一个 Storyboard,这样您就不必让两个文件保持最新。

                生成的故事板与 iOS7+ 兼容。

                在此处阅读有关此内容的更多信息: https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/AboutAdaptiveSizeDesign.html#//apple_ref/doc/uid/TP40014436-CH6-SW1

                使用尺寸类使情节提要或 xib 文件适用于所有可用的屏幕尺寸。这使您的应用程序的用户界面可以在任何 iOS 设备上运行。

                【讨论】:

                  【解决方案14】:

                  这个功能现在是内置的。例如,如果将 Deployment Info -> Devices from iPhone 更改为 Universal 中的项目设置,则会出现以下对话框:

                  【讨论】:

                  • 这可能是 Xcode 中的一个错误,但我从未做过这项工作。生成的 iPad 故事板没有添加到项目中,而且看起来不像是创建的。
                  【解决方案15】:

                  当我昨天遇到同样的问题时,我关注了这个帖子。我遵循的步骤

                  1. 对于 Xcode 5.1,我必须对 iPhone 故事板进行一些清理,例如缺少表单元格的重用标识符,为每个控制器提供故事板 ID,删除未使用的场景。
                  2. 将 MainStoryboard_iPhone.storyboard 复制到 MainStoryboard_iPad.storyboard。
                  3. 使用 vi 编辑器 - 将 targetRuntime="iOS.CocoaTouch" 更改为 targetRuntime="iOS.CocoaTouch.iPad"
                  4. MainStoryboard_iPad.storyboard 中的代码从:<simulatedScreenMetrics key="destination" type="retina4"/> 更改为 <simulatedScreenMetrics key="destination"/>
                  5. 在 Xcode 中打开项目。
                  6. 将部署设备更改为通用 - 选择不复制 iPhone Storyboard 的选项。
                  7. Xcode 会将部署目标默认为 7.1,处理已弃用的功能。
                  8. 修复 iPad Storyboard 中的错位视图错误 - 更改了控制器的框架布局给出错误。

                  就是这样..谢谢大家的帮助..

                  【讨论】:

                    【解决方案16】:

                    最简单、最可靠的方法是从 iPad 故事板上复制粘贴。

                    1. 创建一个新的故事板并将其命名为 MainStoryboard_ipad。
                    2. 通过在项目的目标属性的摘要页面上将设备属性设置为通用,使您的应用程序成为通用应用程序。
                    3. 打开您的 iPhone 故事板并全选并复制
                    4. 打开您的 iPad 故事板并粘贴。

                    您必须调整大小,但这比重新创建整个故事板要快。

                    【讨论】:

                      【解决方案17】:

                      对于支持大小类的 Xcode 版本,有一个非常简单的解决方案(在 Xcode 7 中测试,这是撰写本文时的当前版本)。 选中情节提要文件(文件检查器)上的“使用尺寸等级”复选框,确认出现的对话框。 然后取消选中相同的复选框 - Xcode 会询问您是否要将此情节提要与 iPhone 或 iPad 一起使用,并适当地转换其中的屏幕。 无需直接编辑情节提要文件。对于 iPad 和 iPhone,只需复制相同的情节提要并使用所述方法为 iPad 配置一个,为 iPhone 配置一个。

                      在有人建议使用尺寸等级之前 - 虽然很好,但它们对于高度定制的 UI 不太方便,例如游戏等

                      【讨论】:

                        【解决方案18】:

                        另一种方法

                        1. 在 iPad-Storyboard 中添加带有 Navigation-Controller 的 empty-View-Controller

                        2. 将 Class 更改为您用于 iPhone 的第一个 ViewController 的 Class,“fooViewController”

                        3. 在 iPhone 故事板“fooViewController_storyboard_identifier”中为第一个 ViewController 添加故事板标识符

                        4. 转到“fooViewController.m”

                        5. 添加 bool 变量 bool nibWasLoadForIpad=false

                        6. 转到viewDidLoad-方法

                        if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && !nibWasLoadForIpad)
                        {
                            nibWasLoadForIpad=true;
                            UIStoryboard* Storyboard_iphone=[UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
                            fooViewController *controller = [Storyboard_iphone instantiateViewControllerWithIdentifier:@"fooViewController_storyboard_identifier"];
                            [self.navigationController pushViewController:controller animated:YES];
                            self.modalPresentationStyle = UIModalPresentationCurrentContext;
                        }
                        

                        (ps。知道问题是视图背景将设置为白色)

                        【讨论】:

                          【解决方案19】:

                          你应该创建一个bug report with Apple. 你可以说它是我的一个副本 (10167030),它自 2011 年 9 月以来一直开放。在我看来,令人沮丧的是 Xcode 3 中存在该功能...

                          【讨论】:

                            【解决方案20】:

                            谢谢大家的回答。

                            我按照上述步骤操作,但是当我在模拟器或 iPad 下运行应用程序时,它仍然只使用 iPhone 故事板。

                            由于某种原因,当我将目标设备更改为 Universal 而不是 iPhone 时,Xcode (v5.0) 没有更新 app-Info.plist 文件以包含 iPad 故事板,因此我不得不手动添加以下条目(使用 Xcode 中的 plist 编辑器):

                            主故事板文件基本名称 (iPad) ==> MainStoryboard_iPad

                            【讨论】:

                              【解决方案21】:

                              我只是改变(除了@tharkay 的回答):

                               <device id="ipad9_7" orientation="landscape">
                              

                              而且效果很好!

                              我在 XCode 8.3.3 中使用它

                              【讨论】:

                                猜你喜欢
                                • 2015-09-20
                                • 2012-06-17
                                • 2013-01-26
                                • 2016-08-10
                                • 2014-11-22
                                • 1970-01-01
                                • 1970-01-01
                                • 2013-11-16
                                • 1970-01-01
                                相关资源
                                最近更新 更多