繁体   English   中英

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

[英]Add children view controller in a controller that pushed in a navigation controller

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

UINavigationControlelr
  UIViewController
    ViewController

ViewController有一个称为a的子视图控制器,我在ViewController中添加了一个,其框架是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时,发生了一些奇怪的事情。 在此处输入图片说明

这是怎么回事。 如何解决这个问题? 该项目很简单,您也可以从这里下载以测试问题: 下载

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

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

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

问题的 原因是默认情况下, UIViewControllerview具有FlexibleWidthFlexibleHeight

bControllercControllerview有64像素的额外间隙(navBar(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))
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM