UIView和AutoresizingMask被忽略了

qui*_*yme 8 uiviewcontroller uiview autoresizingmask

第一次发布堆栈溢出.

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

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

[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]];
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[[self view] setAutoresizesSubviews:TRUE];
Run Code Online (Sandbox Code Playgroud)

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

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

qui*_*yme 33

嗯,果然,这是我自己的错.

第一课: 你熬夜试图修复损坏的代码,你不是在为自己做任何好事.休息一下!多喝水!如果你继续试图强迫你的大脑在其睡眠时间之前执行复杂的算法策略和逻辑,你可能只会让事情变得更糟.

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

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

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

无论如何,谢谢参与StackOverflow的每个人!

  • 覆盖-setFrame:是一种非常可靠的方法,可以看到视图已调整大小. (2认同)