UIView和AutoresizingMask被忽略了

时间:2010-09-18 11:44:18

标签: uiview uiviewcontroller autoresizingmask

首次发布堆栈溢出。

我花了好几个小时搜索了许多谷歌搜索,并且在这一点上,几乎已经记住了UIView和UIViewController类的参考文档。无论我做什么,我的应用程序都无视我调整方向更改(或任何其他框架大小修改)的意见。

没有涉及笔尖或xib;我以编程方式构建我的所有视图和viewcontrollers,它们(viewcontrollers)都是我创建的三个自定义UIViewController子类之一的子类。这些超类在loadView:method ...

中有以下几行
[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]];
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[[self view] setAutoresizesSubviews:TRUE];

在所有适当的setter方法中(换句话说,无论我在哪里添加一个subView),我都在重复应用autoresizingMask的步骤。似乎无论我做什么,结果总是一样的 - 我点击构建,点击调试,等待应用程序启动,旋转设备,然后!视图会旋转,但根本不会调整大小。

我在这里缺少什么?这可能是我没看到的明显的东西。任何帮助都是非常感谢,提前谢谢。

1 个答案:

答案 0 :(得分:33)

嗯,当然,这是我自己的错。

第一课: 通过熬夜试图修复损坏的代码,你并没有给自己带来任何好处。休息一下!多喝水!如果你继续试图迫使你的大脑在睡前完成复杂的算法策略和逻辑,你只会让事情变得更糟。

原来我在视图层次结构的底部有一个流氓UIView,它根本没有设置autoresize属性。我以为我已经查看了所有内容,但事实证明我错过了一个。 (只是一个小视图,整整一天拍摄!)

我可以说,对于后来遇到类似挫折的人来说,Autoresizing确实按照记录的方式工作。如果你认为“某些东西没有被称为”那么你可能会找错了地方。此外,UIViewAutoresizingMask枚举常量的使用方式与Interface Builder中的完全不同。在IB中,您“锁定”边距,而在以编程方式设置它们时,默认情况下会假定锁定的边距,并通过将其设置为“灵活”来“解锁”它们。因此,例如,仅设置FlexibleWidth和FlexibleHeight位等同于启用IB中的所有自动调整选项。通过抛出任何边距掩码(即UIViewAutoresizingFlexibleLeftMargin),您将“取消选择”IB中相应的边距自动调整选项。 (我已经看到很多其他帖子漂浮在一起,这似乎是一些人的混乱点。)

然而,在我的研究中,我确实注意到,无论是否自动调整UIView的大小,似乎都没有任何类型的事件,消息,通知或其他内容。虽然没有必要调整子视图的大小,但是如果它的帧大小发生变化,那么在你想要滚动scrollView或tableView的情况下知道它何时发生会很好。我知道当键盘弹出时可以很容易地做到这一点,因为周围有一个通知系统以及TextField delegate方法。所以也许是另一个帖子的话题......

无论如何,谢谢参与StackOverflow的所有人!