【发布时间】:2010-12-28 15:32:06
【问题描述】:
我有一个UINavigationController,并且我希望弹出到堆栈中的每个视图控制器的视图都具有一个共同的填充/边距(例如,所有边均为 25 像素)。实现这一目标的最佳方法是什么?
我原本以为我可以实现UINavigationControllerDelegate,并在navigationController:didShowViewController:animated 或navigationController:willShowViewController:animated 方法中,只需更改即将显示的视图控制器的框架。不过,这似乎没有效果。
我尝试在视图控制器的 viewDidAppear 和 viewWillAppear 方法中做同样的事情,但这也没有用。理想情况下,无论如何我都不想在控制器中添加任何逻辑,因为它们可能并不总是在导航控制器中使用。
我还没有尝试过的最后一个想法是创建一个“包装器”UIViewController,它实际上会被推送到这个堆栈上。这个包装器会将真实视图控制器的视图添加为带有可提供所需边距的框架的子视图。这里的缺点是我需要继承UINavigationController 并覆盖pushViewController:animated,包装器将被初始化和推送。 Apple 的文档表明 UINavigationController 不应该被子类化。
提前致谢。
【问题讨论】:
-
试图实现上面提到的“最后一个想法”,但遇到了障碍。由于正在显示的视图控制器实际上是由另一个视图控制器“包装”的,并且包装器实际上被压入堆栈,因此正在显示的视图控制器上的
navigationController属性是nil。这意味着我无法获得导航控制器的句柄以便将另一个视图控制器推到顶部。 -
另一个数据点:在
navigationController:didShowViewController:animated中更改视图控制器的视图框架确实有效,但视图控制器首先出现在原始框架中,然后在事后调整大小,这看起来很糟糕。更改navigationController:willShowViewController:animated中的框架没有效果。
标签: cocoa-touch ios uikit uinavigationcontroller