我有一个子视图(除了其他标准的Cocoa Touch控件),里面有6个按钮和标签。
我在旋转&使用这个混乱的代码调整旋转事件上的这些按钮和标签。
- (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 power”和内存消耗(我认为只有一个视图而不是两个是更好的记忆,但我可能是错的,我是ios编程的新手。)
感谢您的任何建议!
答案 0 :(得分:2)
现在我正在处理您编写的类似代码。这个项目非常大,很难遵循哪里修改。它是为iOS 3编写的,现在客户端需要进行一些修改。问题不会那么大,如果iOS不会改变pushModal并且在iOS6中会被弃用......在我的情况下需要重写GUI骨架,并且我有Portait / Landscape要求。如果您愿意,请查看几个链接:question1 question2 question3 question4
对于不可预见的iOS更改,将难以概述该代码,尤其是2年后。我不会重复那个曾经工作过的程序员错误。
在你的情况下,我会选择不同的解决方案(但肯定不是这样):
解决方案1:为横向和肖像创建不同的xib。 具有模块化的优点:如果您因各种原因不需要Landscape,则很容易从代码中取消链接。缺点是创建一个新视图(它可以被缓存)但仍然是不同的对象,需要在model-View2-controller之间同步数据。
解决方案2:仅使用1个xib文件并通过在尺寸检查器(第5个选项卡)中设置它们的属性来自动布局组件。很难配置
解决方案3:在xib文件中创建组件 - 横向并将这些组件布局到预期的设计,大小,并在运行时读取它们的大小并设置它,就像现在一样,但可以直观地进行编辑。
Storyboard或xib,对我来说几乎是一样的,可以有2个UIViewController并弹出/推动Portait / Landscape不用旋转来填充堆栈:)
速度是最好的,如果你根本不旋转,但如果你仍然想要,也许1 xib中的2个组件,因为不需要改变能见度2-4倍,这将触发很多od函数调用:viewwillappear,wiewdidapear,viewwilldisapers等。
答案 1 :(得分:2)
你问:
顺便说一下,我想知道是否有两个不同的视图并且在旋转时翻转它们对于“cpu power”和内存消耗更有效...
我相信情况正好相反。拥有一个只需从viewWillLayoutSubviews
调用方法的单一视图效率要高得多(在iOS 5中,在iOS 4中我通常使用willAnimateRotationToInterfaceOrientation
)。效率提升是适度的,但如果效率是你的目标,我认为单一观点是要走的路。如果它们完全不同,您可能希望使用单独的视图,因此您的代码将难以通过单个视图进行管理,但除此之外我坚持使用一个视图。就个人而言,我也认为这是一个更强大的用户界面,可以在旋转设备时将控件设置为动画。
就个人而言,当我有内容重新组织这样的方向更改时,我会尝试避免使用硬编码坐标,而是使用视图的尺寸来算法确定我的控件的布局(例如,每行多少)并从那里确定他们的坐标。通过这种方式,它不仅可以处理横向与纵向,还可以使Universal应用程序(特别是如果将来还有其他具有不同屏幕尺寸的设备)更容易。我想我们也可以期待iOS 6也提供一些很好的增强功能来设置控件(尽管我们会在开发需要iOS 6的应用程序之前感觉很舒服)。