首页 文章

将Storyboard从iPhone转换为iPad

提问于
浏览
214

我有一个 iPhone 应用程序,它有一个故事板 . 现在我想提供一个 iPad 应用程序 . 所以我问我是否有一个功能可以帮助我将 iPhone 故事板转换为 iPad 故事板 .

再具体一点:

Is there a similar function or is there only the manual way ?

21 回答

  • 5

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

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

    而且效果很好!

    我在XCode 8.3.3中使用它

  • 60

    你应该创建一个bug report with Apple.你可以说它是我的重复(10167030),自2011年9月以来一直开放 . 从我的观点来看令人沮丧的是Xcode 3中存在的这个特征......

  • 3

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

    2 - 右键单击您 "MainStoryboard_iPhone.storyboard" 和"Open as -> Source Code" . 复制一切;

    3-右键单击 "MainStoryboard_iPad.storyboard" 和"Open as -> Source Code" . 粘贴一切 . 现在搜索并更改:

    • 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文件

  • 8

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

    • 为iPad版创建新的故事板文件

    • 打开新文件和我要在textwrangler中复制的文件(文本编辑器)

    • 将旧文件中的xml文本复制到这些xml标记之间的新文件中

    • 第一个标签 <scenes> <!--Contents View Controller-->

    • 粘贴在这里

    • 结束标签 </class> </classes>

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

  • 0

    通过读取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“打开” - >“IOS StoryBoard”5 . 您可能还需要更改约束 . 多数民众赞成你所做的一切 .

  • 532

    对于Xcode10

    • 只需复制 Main.storyboard

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

    • .plist 中设置适当的名称

    enter image description here

    4.只需选择正确的.storyboard来配置
    enter image description here

  • 8

    最简单,最可靠的方法是从iPad故事板中复制粘贴 .

    • 创建一个新的故事板并将其命名为MainStoryboard_ipad .

    • 通过在项目的“目标”属性的“摘要”页面上将“设备”属性设置为“通用”,使您的应用成为通用应用 .
      enter image description here

    • 打开iPhone故事板并选择全部并复制

    • 打开iPad故事板并粘贴 .

    您将不得不重新调整大小,但它可能比重新创建整个故事板更快 .

  • 3

    谢谢大家的答案 .

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

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

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

  • 10
    1. Create New Storyboard file with MainStoryboard_iPad.storyboard
    2. Copy All the views from MainStoryboard and paste to MainStoryboard_iPad.storyboard
    
  • 4

    使用XCode6大小类,您不再需要将故事板转换为iPad . 同一个Storyboard可用于iPhone和iPad,使您无法保持两个文件的最新状态 .

    生成的故事板与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设备上运行 .

  • 0

    转到目标摘要并将设备更改为通用,然后下载并将ipad版本设置为您喜欢的任何故事板,包括复制和重命名的故事板(如果您愿意) .

  • 3

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

    toolsVersion="5023" systemVersion="13A603"
    

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

  • 0

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

    编辑:似乎属性检查器中UITableView的默认背景是相当奇怪的 . 我必须手动将背景设置为分组表视图的“组表视图背景颜色”,并为非分组表视图设置“白色颜色” . 然后它显示为“默认”(我假设它然后匹配硬编码值) . - 实际上,甚至更容易,从“Grouped”更改为“Static”,然后返回似乎重置默认颜色 .

  • 2

    我昨天遇到同样问题的时候跟着这个帖子 . 我遵循的步骤

    • 对于Xcode 5.1,我不得不对iPhone故事板进行一些清理,比如缺少表格单元的reuseIdentifiers,为每个控制器提供故事板ID,删除未使用的场景 .

    • 将MainStoryboard_iPhone.storyboard复制到MainStoryboard_iPad.storyboard .

    • 使用vi编辑器 - 将 targetRuntime="iOS.CocoaTouch" 更改为 targetRuntime="iOS.CocoaTouch.iPad"

    • MainStoryboard_iPad.storyboard 中的代码从: <simulatedScreenMetrics key="destination" type="retina4"/> 更改为 <simulatedScreenMetrics key="destination"/>

    • 在Xcode中打开项目 .

    • 将部署设备更改为通用 - 选择不复制iPhone故事板的选项 .

    • Xcode将默认部署目标设为7.1,负责已弃用的功能 .

    • 修复iPad故事板中错误放置的视图错误 - 更改了控制器的框架布局,给出了错误 .

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

  • 6

    我发现了一种解决方案:

    • 复制您的iPhone-Storyboard并重命名 MainStoryboard_iPad.storyboard

    • 关闭Xcode然后打开该文件任何文本编辑器 .

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

    • 更改MainStoryboard_iPad.storyboard中的代码:

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

    <simulatedScreenMetrics key="destination"/>

    • 现在保存所有内容并重新打开Xcode . iPad-Storyboard与iPhone文件具有相同的内容,但每一个都可能被混乱 .

    这节省了我的时间 - 希望这对你有所帮助

  • 2

    此功能现在已内置 . 例如,如果将部署信息 - >设备中的项目设置从iPhone更改为通用,则会显示以下对话框:

    enter image description here

  • 1

    对于支持大小类的Xcode版本,有一个非常简单的解决方案(在Xcode 7中测试,这是编写本文时的当前版本) . Check 故事板文件(文件检查器)上的 "use size classes" 复选框,确认出现的对话框 . Then uncheck 同样的复选框 - Xcode将询问您是否要将此故事板与iPhone或iPad一起使用,并适当地转换其中的屏幕 . No need to directly edit the storyboard file . 对于iPad和iPhone,只需复制相同的故事板,并使用所述方法为iPad配置一个,为iPhone配置一个 .

    在有人建议使用大小类之前 - 虽然很好,但它们对于大量定制的UI(例如游戏等)来说不太方便

  • 1

    正如对那些可能遇到我的问题的人的快速记录:

    我的问题:

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

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

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

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

    谢谢你的帖子,我希望这个提到有助于在某个地方找到障碍 .

  • 1

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

  • 3

    这些东西节省了我几个小时,可能会帮助那些有Python技能的人 .

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

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

    所以我写了这个小的python jig脚本来扫描storyboard文件中的x,y,width,height并按比例缩放320./768 . 那么请允许我专注于精细调整 .

    • 将iPad故事板复制到新文件中 . (例如iPhoneStoryboard.storyboard)

    • 运行下面的脚本,并将复制的故事板文件名作为第一个参数 .

    • 将生成带后缀_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()
    
  • 2

    一种不同的方法

    • 在iPad-Storyboard中添加带有Navigation-Controller的空视图控制器

    • 将Class更改为用于iPhone的第一个ViewController的类,“fooViewController”

    • 为第一个ViewController在iPhone-Storyboard“fooViewController_storyboard_identifier”中添加Storyboard-Identifier

    • 转到“fooViewController.m”

    • 添加bool变量bool nibWasLoadForIpad=false

    • 转到 viewDidLoad -Method

    if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPad &&!nibWasLoadForIpad)
    {
    nibWasLoadForIpad = TRUE;
    UIStoryboard * Storyboard_iphone = [UIStoryboardstoryboardWithName:@“Main_iPhone”包:nil];
    fooViewController * controller = [Storyboard_iphone instantiateViewControllerWithIdentifier:@“fooViewController_storyboard_identifier”];
    [self.navigationController pushViewController:controller animated:YES];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    }

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

相关问题