UIView 和 -setBounds 问题

Posted

技术标签:

【中文标题】UIView 和 -setBounds 问题【英文标题】:UIView and -setBounds issue 【发布时间】:2009-12-30 16:06:30 【问题描述】:

我正在使用 UINavigationController 来管理我的 UIViewControllers 层次结构。对于这些 UIViewController 之一,我需要以编程方式更改其视图边界(取决于特定条件),因此我使用了 setBounds 并且它工作正常。

我的问题是:当我更改此视图边界时,然后将另一个 UIViewController 推送到 UINavigationController 堆栈,然后弹出最后一个 UIViewController,我的边界更改将丢失。我想这是因为我的 UIView 被重绘了,但我认为边界修改仍然有效。

我可以在视图出现后再次更改我的 UIView 边界,但用户会注意到视图边界的修改。

有什么建议吗?这是一种常见的情况,还是因为我的 UIView 是从 XIB 加载的,我错过了一个参数或什么?

谢谢:)

编辑:刚刚注意到我的 UIView 边界在将新 UIViewController 推送到堆栈之前发生了更改(在动画期间)

【问题讨论】:

【参考方案1】:

您可能希望在-viewWillAppear: 中进行所有的边界设置(包括第一次)。在初始推送和弹出情况下,这应该在您出现在屏幕上之前被调用。

【讨论】:

那将是最好的选择,但不幸的是我需要从我的 UINavigationController 委托更改边界(因为此边界修改与视图无关;修改可能发生在我的任何视图上) 等效的委托方法是navigationController:willShowViewController:animated:。当您在那里重新设置边界时会发生什么? 当我在 willShowViewController 方法中更改边界时,我的边界显然在显示之前被覆盖了,所以目前,边界修改是在 didShowViewController 中完成的【参考方案2】:

您的视图可能设置了自动调整大小。如果您不希望这样,请将自动调整大小设置为 0:

myView.autoresizingMask = 0;

【讨论】:

【参考方案3】:

你在哪里改变界限?也许你应该把它放在 viewWillAppear/didAppear 这样的地方,这样每次下一个 View Controller 从堆栈中弹出时都会改变边界?

【讨论】:

我的边界被 UINavigationController 委托改变了;我正在使用 willShowViewController 和 didShowViewController 方法查看我的情况。 为什么不在 willShowViewController 中设置一个在 viewWillAppear 中读取的变量,然后根据值修改边界?无论如何,从 Nav Controller Delegate 修改特定视图听起来有点奇怪。 我同意这很奇怪,但这是我们找到的创建独立于应用程序的广告展示器的最佳解决方案;我们不想更改应用程序及其视图控制器来这样做,所以我需要在这个委托中完成所有事情。当我在 willShowViewController 方法中更改边界时,我的边界显然在显示之前被覆盖,因此,目前,边界修改是在 didShowViewController 中完成的(这就是用户可能会注意到修改的原因)

以上是关于UIView 和 -setBounds 问题的主要内容,如果未能解决你的问题,请参考以下文章

在另一个自定义 UIView 中设置/更改嵌套自定义 UIView 的变量

获取触摸 UIView 的手指数

TouchesBegan 总是返回错误的 UIView

使用 UIView 动画后应用程序变慢

使用点击手势更改 UIView 的背景颜色(iOS)

NSConstraints 在第二次加载 UIView 后崩溃应用程序