在推送导航控制器的控制器中添加子视图控制器

Add children view controller in a controller that pushed in a navigation controller

我有一个名为 ViewController 的简单视图控制器,它位于导航堆栈中,结构如下所示:

UINavigationControlelr
  UIViewController
    ViewController

ViewController 有一个名为 a 的子视图控制器,我将 a 添加到 ViewController,a 的框架是 ViewController 的边界。我有两个另外的 UIViewController 叫 b 和 c,我把 b 和 c 添加到 a。 b 的框架是

CGRect(x: 0, y: 0, width: 100, height: 100)

c的框架是

CGRect(x: 0, y: 100, width: 100, height: 100)

如果我将导航栏半透明设置为true,视图显示正确,如下所示:

但是当我将导航栏半透明设置为false时,奇怪的事情发生了。

这是怎么回事。如何解决这个问题? 工程简单,也可以从这里下载测试问题:download

您正在 viewDidLoad 中设置视图框架,请注意视图布局要等到很晚才完成。 viewWillLayoutSubviewsviewDidLayoutSubviews 分别在布局发生之前和之后调用。

将您的框架设置代码移至 viewDidLayoutSubviews,它将正常工作。

注意::您也可以在 viewWillAppear 中设置视图的框架,但这是设置框架的正确位置。 viewWillAppear 在视图即将出现之前调用,视图布局可以在视图出现后更改(例如响应设备旋转)。

问题的原因默认是UIViewControllerviewFlexibleWidth& FlexibleHeight

bControllercControllerview 有额外的 64 像素间隙(导航栏(44)+ 状态栏(20))。现在,当您调整大小时,它可以使用那些“FlexibleWidth&FlexibleHeight”。

解决方案可以使 autoresizingMask 变为 .None

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = UIColor.greenColor()

    bController = b()
    cController = c()

    bController.view.autoresizingMask = .None
    cController.view.autoresizingMask = .None

    displayContentController(bController, toFrame: CGRect(x: 0, y: 0, width: 100, height: 100))
    displayContentController(cController, toFrame: CGRect(x: 0, y: 100, width: 100, height: 100))
}