UIView 和 AutoresizingMask 被忽略
Posted
技术标签:
【中文标题】UIView 和 AutoresizingMask 被忽略【英文标题】:UIView and AutoresizingMask ignored 【发布时间】:2010-09-18 11:44:18 【问题描述】:第一次发布堆栈溢出。
我已经花费了数小时搜索许多 Google 搜索,并且在这一点上,实际上已经记住了 UIView 和 UIViewController 类参考文档。无论我做什么,我的应用程序都忽略了我调整我对方向更改(或任何其他帧大小修改)视图大小的努力。
不涉及 nib 或 xib;我正在以编程方式构建我的所有视图和视图控制器,它们(视图控制器)都是我创建的三个自定义 UIViewController 子类之一的子类。这些超类的 loadView 中有以下几行:method...
[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]];
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
[[self view] setAutoresizesSubviews:TRUE];
在所有适当的 setter 方法中(换句话说,无论我在哪里添加 subView),我都在重复应用 autoresizingMask 的步骤。似乎无论我做什么,结果总是一样的——我点击构建,点击调试,等待应用启动,旋转设备,然后presto!视图旋转但根本不调整大小。
我在这里缺少什么?这可能是我没有看到的显而易见的事情。任何帮助都非常感谢,在此先感谢。
【问题讨论】:
【参考方案1】:嗯,果然是我自己的错。
第一课: 熬夜试图修复损坏的代码对你没有任何好处。休息一下!多喝水!如果你一直试图强迫你的大脑在睡前执行复杂的算法策略和逻辑,你可能只会让事情变得更糟。
原来我在视图层次结构的底部有一个流氓 UIView,它根本没有设置 autoresize 属性。我以为我已经浏览了所有内容,但事实证明我错过了一个。 (只是一个小视图,一整天的拍摄!)
对于后来遇到类似挫折的任何人,我可以说,Autoresizing
确实按照记录的方式工作。如果您认为“某些东西没有被调用”,那么您可能找错地方了。此外,UIViewAutoresizingMask
枚举常量的使用与在 Interface Builder 中的使用方式不同。在 IB 中,您“锁定”边距,而在以编程方式设置它们时,默认假定锁定的边距,您通过将其设置为“灵活”来“解锁”它们。因此,例如,仅设置 FlexibleWidth 和 FlexibleHeight 位等效于启用 IB 中的所有自动调整大小选项。通过添加任何边距掩码(即UIViewAutoresizingFlexibleLeftMargin
),您将“取消选择”IB 中相应的边距自动调整选项。 (我看过很多其他帖子,这似乎是一些人的主要困惑点。)
然而,在我的研究过程中,我确实注意到当 UIView 被调整大小时,无论是否自动调整,似乎都没有任何类型的事件、消息、通知或其他。虽然不需要调整 subViews 的大小,但如果它的帧大小发生变化,那么在您希望让 scrollView 或 tableView 滚动的情况下,很高兴知道它何时发生。我知道当键盘弹出时可以很容易地做到这一点,因为有一个通知系统以及TextField
delegate
方法。所以也许是另一个帖子的主题......
无论如何,感谢所有参与 *** 的人!
【讨论】:
覆盖 -setFrame: 是查看视图大小调整的一种非常可靠的方法。 哦,是的,当然!我在调试保留计数时一直使用该技术,但我经常忽略在其他情况下这样做。 (有趣的是,显而易见的事情是多么回避。)为了澄清您对其他人的评论,这是指覆盖 -setFrame 以便吐出一些告诉您视图名称和一些帧值的 NSLog。 (如果你尝试这个,别忘了调用 super 的实现。) 除此之外,我不会将该方法用于其他任何事情。在将代码发布为生产之前,我还会确保禁用覆盖。 在哪里覆盖 setFrame? UIViewController 还是 UIView 子类? 'setFrame:' 在 UIView 上。此外,如果您需要知道它何时发生在任何和所有视图中,您可以创建一个影响所有 UIView 和子类并记录事件的类别方法。同样,我建议不要将此方法用于临时故障排除以外的任何其他目的。对视图内容的任何更新都应由其视图控制器处理。以上是关于UIView 和 AutoresizingMask 被忽略的主要内容,如果未能解决你的问题,请参考以下文章
关于UIView的autoresizingMask属性的研究转
UIView AutoresizingMask 用于将按钮固定到右下角