UIView和AutoresizingMask被忽略

UIView和AutoresizingMask被忽略,uiview,uiviewcontroller,autoresizingmask,Uiview,Uiviewcontroller,Autoresizingmask,第一次在堆栈溢出上过帐 我花了好几个小时浏览了很多谷歌搜索,在这一点上,我几乎记住了UIView和UIViewController类参考文档。无论我做什么,我的应用程序都忽略了我在方向改变时调整视图大小的努力(或任何其他帧大小的修改) 没有涉及NIB或XIB;我正在以编程方式构建所有视图和ViewController,它们(ViewController)都是我创建的三个自定义UIViewController子类之一的子类。这些超类在其loadView中有以下行:方法 [self setView:

第一次在堆栈溢出上过帐

我花了好几个小时浏览了很多谷歌搜索,在这一点上,我几乎记住了UIView和UIViewController类参考文档。无论我做什么,我的应用程序都忽略了我在方向改变时调整视图大小的努力(或任何其他帧大小的修改)

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

[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]];
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[[self view] setAutoresizesSubviews:TRUE];
在所有适当的setter方法中(换句话说,无论我在哪里添加子视图),我都在重复应用autoresizingMask的步骤。似乎无论我做什么,结果都是一样的——我单击build,单击debug,等待应用程序启动,旋转设备,然后presto!视图会旋转,但根本不会调整大小


我错过了什么?这可能是我没有看到的一些明显的东西。非常感谢您的帮助,请提前感谢。

当然,这是我自己的错。

第一课:整晚熬夜试图修复损坏的代码,这对你自己没有任何好处。休息一下!多喝水!如果你一直试图强迫你的大脑在睡前执行复杂的算法策略和逻辑,你只会让事情变得更糟

事实证明,我在视图层次结构的底部有一个rogue UIView,它根本没有设置autoresize属性。我以为我已经看完了所有的东西,但结果发现我漏掉了一个。(只需一个小视图,以及一整天的拍摄!)

我可以说,对于后来遇到类似挫折的任何人来说,
自动调整大小
确实可以像文档中描述的那样工作。如果你认为“没有人叫你什么”,那么你可能找错地方了。此外,
UIViewAutoresizingMask
enum常量的使用方式与Interface Builder中的使用方式不同。在IB中,您可以“锁定”页边距,而在以编程方式设置页边距时,默认情况下会假定锁定的页边距,您可以通过将其设置为“灵活”来“解锁”页边距。因此,例如,仅设置FlexibleWidth和FlexibleHeight位相当于启用IB中的所有自动调整边距选项。通过插入任何边距掩码(即,
UIViewAutoresizingFlexibleLeftMargin
),可以“取消”IB中相应的边距自动调整边距选项。(我已经看到许多其他帖子,对一些人来说,这似乎是一个主要的困惑点。)

然而,在我的研究过程中,我确实注意到,当UIView调整大小时,似乎没有任何类型的事件、消息、通知或其他,无论是否自动调整。虽然调整子视图的大小不是必需的,但最好知道在您希望引起scrollView或tableView的情况下何时发生当它的帧大小改变时滚动。我知道当键盘弹出时可以很容易地做到这一点,因为它周围有一个通知系统,以及
文本字段
委托
方法。所以可能是另一篇文章的主题


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

覆盖-setFrame:是查看视图大小的一种非常可靠的方法。哦,是的,当然!我在调试保留计数时一直使用这种技术,但我经常忽略在其他情况下这样做。(有趣的是,显而易见的做法是多么回避。)为了向其他人澄清您的评论,这指的是overriding-setFrame,以便生成一些NSLog,告诉您视图的名称和一些帧值。(如果尝试此操作,请不要忘记调用super的实现。)除此之外,我不会在其他任何情况下使用该方法。在将代码发布为产品之前,我也会强制禁用覆盖。您在哪里覆盖setFrame?UIViewController或UIView子类?setFrame:'在UIView上。此外,如果您需要知道任何和所有视图何时发生这种情况,您可以创建一个影响所有UIView和子类并记录事件。同样,我建议不要将此方法用于临时故障排除以外的任何其他目的。视图内容的任何更新都应由其视图控制器处理。