【问题标题】:What's the best way to reorganize elements in a view after rotation?旋转后重新组织视图中元素的最佳方法是什么?
【发布时间】:2025-12-31 07:45:09
【问题描述】:

我有一个子视图,里面有 6 个按钮和标签(除了其他标准的 Cocoa Touch 控件)。

我正在使用这个凌乱的代码在旋转事件中旋转和调整这些按钮和标签的大小。

- (void) updateLayoutForNewOrientation: (UIInterfaceOrientation) orientation {
    if (UIInterfaceOrientationIsPortrait(orientation)) {
        button1.frame = CGRectMake(20, 59, 130, 80);
        button2.frame = CGRectMake(170, 59, 130, 80);
        button3.frame = CGRectMake(20, 176, 130, 80);
        button4.frame = CGRectMake(170, 176, 130, 80);
        button5.frame = CGRectMake(20, 293, 130, 80);
        button6.frame = CGRectMake(170, 293, 130, 80);

        label1.frame  = CGRectMake(20, 147, 130, 21);
        label2.frame  = CGRectMake(170, 147, 130, 21);
        label3.frame  = CGRectMake(20, 264, 130, 21);
        label4.frame  = CGRectMake(170, 264, 130, 21);
        label5.frame  = CGRectMake(20, 381, 130, 21);
        label6.frame  = CGRectMake(170, 381, 130, 21);
    } else {
        button1.frame = CGRectMake(20, 59, 130, 60);
        button2.frame = CGRectMake(20, 155, 130, 60);
        button3.frame = CGRectMake(177, 59, 130, 60);
        button4.frame = CGRectMake(177, 155, 130, 60);
        button5.frame = CGRectMake(328, 59, 130, 60);
        button6.frame = CGRectMake(328, 155, 130, 60);

        label1.frame  = CGRectMake(20, 127, 130, 21);
        label2.frame  = CGRectMake(20, 223, 130, 21);
        label3.frame  = CGRectMake(177, 127, 130, 21);
        label4.frame  = CGRectMake(177, 223, 130, 21);
        label5.frame  = CGRectMake(328, 127, 130, 21);
        label6.frame  = CGRectMake(328, 223, 130, 21);
    }
}

这有点乱,但工作正常,我可以精确控制视图中的元素位置

顺便说一下我想知道是否有两个不同的视图并在旋转时翻转它们是否更有效关于“cpu 功率”和内存消耗(我认为只有一个视图而不是两个视图是更好的记忆,但我可能是错的,我对 ios 编程很陌生)。

感谢您的任何建议!

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    现在我正在编写与您编写的类似的代码。这个项目很大,很难遵循什么地方去修改。它是为 iOS 3 编写的,现在客户端需要进行一些修改。如果 iOS 不会更改 pushModal 并且会在 iOS6 中被弃用,那么问题就不会那么大了……在我的情况下,需要重写 GUI 框架,并且我有 Portait / Landscape 要求。如果您愿意,请查看几个链接:question1 question2question3question4

    对于不可见的 iOS 更改,很难概述该代码,尤其是在 2 年后。我不会重复以前工作过的程序员错误。

    在你的情况下,我会从不同的解决方案中进行选择(但这肯定不是):

    解决方案 1:为横向和纵向创建不同的 xib。 具有模块化的优点:以后如果由于各种原因不需要 Landscape,很容易从代码中取消链接。具有创建新视图的缺点(它可以被缓存)但仍然是不同的对象并且需要模型-View2-控制器之间的数据同步。

    解决方案2:仅使用 1 个 xib 文件并通过在尺寸检查器(第 5 个选项卡)中设置它们的属性来自动布局组件。很难配置

    解决方案 3:在该 xib 文件中创建组件横向并布局这些组件以匹配预期的设计、大小,并在运行时读取它们的大小并设置它,就像现在这样,但可以可视化编辑。

    Storyboard 或 xib,对我来说几乎一样,可以有 2 个 UIViewController 并弹出/推送 Portait/Landscape 以不使用旋转填充堆栈:)

    如果你根本不旋转它是最好的,但如果你仍然想要,也许 1 xib 中的 2 个组件,因为不需要改变可见性 2-4 次,这会触发很多 od函数调用:viewwillappear、wiewdidapear、viewwilldisapers等。

    【讨论】:

    • 感谢您的完整回答:)
    • 因为我已经发布了有人投反对票的问题,lool
    【解决方案2】:

    你问:

    顺便说一句,我想知道是否有两个不同的视图并在旋转时翻转它们在“cpu 功率”和内存消耗方面是否更有效......

    我认为情况正好相反。拥有一个视图要高效得多,您只需从viewWillLayoutSubviews 调用您的方法(在iOS 5 中,在iOS 4 中我通常使用willAnimateRotationToInterfaceOrientation)。效率增益是适度的,但如果效率是您的目标,我认为单一视图是要走的路。如果它们完全不同,您可能希望使用单独的视图,因此您的代码将变得难以使用单个视图进行管理,但否则我坚持使用一个视图。就我个人而言,我还认为在您旋转设备时让控件动画到位是一个更强大的用户界面。

    就我个人而言,当我的内容像这样根据方向变化进行重组时,我会尽量避免使用硬编码坐标,而是使用视图的尺寸来通过算法确定控件的布局(例如,每行有多少个) ) 并从那里确定它们的坐标。这样,它不仅可以处理横向与纵向,还可以使通用应用程序(特别是如果将来有其他具有不同屏幕尺寸的设备)更容易,也是。我认为我们也可以期待 iOS 6 也为布局控件提供一些不错的改进(尽管我们还需要一段时间才能适应开发需要 iOS 6 的应用程序)。

    【讨论】:

    • 感谢您的回答!我相信单视图方法更好,我需要优化我的代码以使其更具可读性并且更像真实代码:P
    最近更新 更多