【问题标题】:Create single .xib for Universal app in Interface Builder? (iOS)在 Interface Builder 中为通用应用程序创建单个 .xib? (iOS)
【发布时间】:2012-04-19 05:40:01
【问题描述】:

抱歉,如果这是一个愚蠢的问题,但我已经做了一些谷歌搜索和搜索,但没有找到任何人问这个确切的问题。

我从事 iOS 开发已经有一段时间了,但我对 Interface Builder 完全陌生。我想知道的是:有没有办法只创建一个 .xib 文件,然后在通用应用程序中将它用于 iPhone 和 iPad?

对我来说,必须单独创建它们似乎很愚蠢;为什么我可以在代码中执行一次(对屏幕大小进行细微调整)时,还要在 Interface Builder 中进行多次布局?

如果我在这里遗漏/误解了某些内容,请告诉我。就像我说的,我是一个完整的 Interface Builder 新手 :)

编辑:我过去曾向 App Store 提交过非界面构建游戏,其中 iPhone 和 iPad 版本是相同的,所以我不关心让游戏在每台设备上的外观/感觉都不同。我打算让它们看起来完全一样,除了由于纵横比的不同而导致的一些轻微的定位变化。

【问题讨论】:

    标签: objective-c ios xcode interface-builder universal


    【解决方案1】:

    如果您知道根据自动调整大小生成的视图会是什么样子,您确实可以只使用一个.xib。如果视图只是某种共享组件,可以根据需要自动调整大小,则可能会派上用场。但是,如果您需要让 iPad 上的视图看起来与 iPhone 上的完全不同,只需使用两个 .xibs。然后可以根据需要加载适当的,例如在实例初始化程序中,比如这个控制器的 -init:

    - (id)init
    {
        if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
        {
             self = [super initWithNibName:@"YourNibForPad" bundle:nil];
        }
        else
        {
             self = [super initWithNibName:@"YourNibForPhone" bundle:nil];
        }
        if (self) { /* initialize other ivars */ }
        return self;
    }
    

    【讨论】:

    • 您能进一步解释一下吗?我了解如何单独加载文件,但我不想这样做。当我创建一个新的基于视图的应用程序时,它会自动为 iPad 和 iPhone 创建一个单独的 xib。我怎样才能只使用一个并将其链接到两个设备?谢谢!
    • 如果你真的、真的、真的需要那个,只需删除另一个 xib 并保留你需要的那个,并将其名称作为参数传递给-initWithNibName:bundle:。还要确保从该 xib 加载的视图在两种设备上都表现良好,例如自动调整大小规则等。
    • 太棒了!这正是我想要的;我现在觉得自己没有弄清楚这件事有点傻。非常感谢您的回答!这正是我所需要的:)
    • @ThePablick,这不起作用,因为我在同一个应用程序中有不同的 ipad 和 iphone 目标。有什么解决方法吗?
    • 您可以通过如下命名您的 pad 和 phone xib 来删除 userInterfaceIdiom 检查。你的笔尖~ipad 你的笔尖~iphone 。然后你可以做 super initWithNibName:@"yourNib" 并且 iOS 会为你确定要加载哪一个。然后你可以这样做.... -(instancetype)init { self = [super initWIthNibName:@"yourNib"]; if (self) // 做的事情 return self; }
    【解决方案2】:

    XIB 是单独的文件的主要原因是因为 Apple 认为为 iPhone/iPod touch 和 iPad 设计的 UI 应该分别针对每一个进行定制。这在他们的iOS App Programming Guide 中得到了回应,上面写着:

    对于视图,主要修改是重新设计视图布局以支持更大的屏幕。简单地缩放现有视图可能有效,但通常不会产生最佳结果。您的新界面应该利用可用空间并在适当的情况下利用新的界面元素。这样做更有可能使用户感觉更自然的界面,而不仅仅是更大屏幕上的 iPhone 应用程序。

    虽然为实际上是一个 UI 维护两个 XIB 可能需要一些时间,但我觉得这比使用一个 XIB 然后必须连接大部分 UI 元素以便在该 XIB 时以编程方式移动它们更简单负载。毕竟,至少有两个 XIB,您可以查看每个 UI 的外观,然后轻松进行视觉更改。

    顺便说一句,不要忘记 iOS 5 的 Storyboards (read about them here),它使管理视图/视图控制器层次结构变得更加简单。

    【讨论】:

    • 我很欣赏这些信息,并会在建议下接受它。但是,有没有办法只开发一个 .xib 文件?我个人认为 Apple 的上述引用与应用程序比与游戏更相关(我正在研究游戏)。因此,虽然我很欣赏并理解您在说什么,但我想知道是否可以(如果可以,如何)从一个 .xib 加载到 iPhone 和 iPad。我无意在我的游戏中更改两个设备之间的界面,所以……重复这项工作似乎是在浪费时间。
    • 您打算使用 Quartz 或其他绘图方法直接绘制到视图中吗?
    • 或者我们最好确切地知道您的 UI 将要做什么,以及它是否会包含需要连接的库存 IB 元素。
    • 不应该,不。我只是尝试在界面构建器中绘制出UI的基本元素,之后我将继续用代码编写游戏逻辑。我想……我的问题不是这是否可取(尽管我很欣赏有关该观点的信息),而是是否可以做到,如果可以,如何做到。默认情况下会创建两个单独的 xib。我想要一个,我希望它链接到 iPhone 和 iPad。我可以这样做吗?如果可以,该怎么做?谢谢。
    • 如果我做一个合理的猜测,在项目摘要中检查一个地方,当你的应用程序目标被选中时:在部署信息部分下,有 iPhone 和 iPad 的主界面菜单,您也许可以将这两个设置为相同的 XIB。不过我还没有测试过。
    【解决方案3】:

    试着给它们命名

    MyCell.xibMyCell ~ ipad.xib

    然后:

    [self.tableView registerNib: @"MyCell" forCellReuseIdentifier: @"MyUniqueIdentifier"];
    

    【讨论】:

      【解决方案4】:

      如果您使用 IB,您需要为 iPhone 和 iPad 创建 2 个单独的 xib 文件。您需要单独的 iPad xib 以使您的应用符合 Apple iPad UI 指南。

      【讨论】:

      • 我知道这不是真的,因为我过去曾向 iPhone 和 iPad 版本相同的商店提交过非界面构建器应用程序。我可能应该在问题中指出我正在制作游戏,而不是应用程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 2023-03-08
      • 2023-03-18
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多