【问题标题】:how to handle swapping a view when device rotates on iOS当设备在 iOS 上旋转时如何处理交换视图
【发布时间】:2012-02-24 06:19:48
【问题描述】:

所以我按照以下教程创建与设备方向相关的自定义视图:

http://www.theappcodeblog.com/2011/03/30/orientation-change-tutorial-change-the-view-when-the-orientation-changes/

总结这篇文章,作者能够在检测到设备旋转时通过指向 XIB 文件中的新顶层视图来生成横向和纵向方向的自定义视图。

因此,我采用了复杂的视图层次结构(许多按钮、滑块、视图中的视图),在顶层复制所有内容以创建横向视图。然后为横向视图创建自定义排列。在我的代码检测横向方向的方法中,我的代码在检测纵向时指向横向层次结构和纵向的顶部。

这可行,除了横向层次结构中的所有 IBOutlets(UIView、UIButton 等)仍在纵向视图层次结构中引用它们的等效对象。我在运行时对这些 UI 元素进行了很多特殊处理,因此我需要 IBOutlets 而不仅仅是 IBActions。我发现我在横向视图中复制的 UI 元素可以指向相同的 IBAction,但它们不能与纵向层次结构中的那些共享 IBOutlets。

我是否必须复制所有对象并让我的代码管理所有内容(确定要使用的对象)?

【问题讨论】:

    标签: ios uiview orientation


    【解决方案1】:

    这是一种可能适合您的方法。

    如果您在需要交换横向视图时加载横向 nib,您可以将视图控制器作为 nib 文件的所有者传递,并且 nib 加载器将根据连接覆盖视图控制器的出口风景笔尖。

    当您需要再次交换纵向视图时,加载纵向笔尖并将视图控制器作为文件的所有者传递。 nib 加载器将再次覆盖视图控制器的 outlet,这一次基于纵向 nib 中的连接。

    您应该在第一次需要 nib 时为每个 nib 创建一个 UINib 对象,并保留它们以加快后续旋转的加载速度。

    【讨论】:

    • 肯定会试一试。所以我得到我需要做的是 1. 复制 .​​xib 文件(可以在 Finder 应用程序中完成)。 2. 重新排列布局。 3.在适当的时候加载我的风景笔尖......是这个电话吗? "- (NSArray *)loadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options".... 就这样??
    • 您可以使用该方法。如果你发现速度太慢,你应该看看UINib
    • 我试过那个方法,调用是:[[NSBundle mainBundle] loadNibNamed:@"MyLandscapeOrPortraitNib" owner:self options:nil]; inside - (void)orientationChanged:(id)object(取决于它是否检测到横向/纵向)。但是,当新笔尖被加载时,我只看到我的一些内容,并且我的应用程序很快就崩溃了(由于缺少该内容)。现在我注意到,如果我注释掉笔尖加载行,那么我的应用程序在纵向模式下运行 100% 正常。然后,当我添加笔尖时,横向和纵向都缺少内容。
    • 这就是我刚刚所做的,如果我在应用程序启动时在横向或纵向视图上使用 initWithNibName,那么效果很好。但是,如果我在orientationChanged 下加载NibNamed,那么我会得到带有一堆未初始化内容的新布局。
    【解决方案2】:

    我使用 loadNibNamed 解决了这个问题。基本上我必须做的是保存所有 IBOUlet 变量(使用非 IB 变量)和在视图中初始化的其他变量的状态。当一个新的 Nib 被加载时,一切都会恢复到它们的默认状态。这很烦人,但这似乎是目前解决此问题的最佳方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      相关资源
      最近更新 更多