在推送导航控制器的控制器中添加子视图控制器
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
中设置视图框架,请注意视图布局要等到很晚才完成。 viewWillLayoutSubviews
和 viewDidLayoutSubviews
分别在布局发生之前和之后调用。
将您的框架设置代码移至 viewDidLayoutSubviews
,它将正常工作。
注意::您也可以在 viewWillAppear
中设置视图的框架,但这是设置框架的正确位置。 viewWillAppear
在视图即将出现之前调用,视图布局可以在视图出现后更改(例如响应设备旋转)。
问题的原因默认是UIViewController
的view
有FlexibleWidth
&
FlexibleHeight
bController
和 cController
的 view
有额外的 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))
}
我有一个名为 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
中设置视图框架,请注意视图布局要等到很晚才完成。 viewWillLayoutSubviews
和 viewDidLayoutSubviews
分别在布局发生之前和之后调用。
将您的框架设置代码移至 viewDidLayoutSubviews
,它将正常工作。
注意::您也可以在 viewWillAppear
中设置视图的框架,但这是设置框架的正确位置。 viewWillAppear
在视图即将出现之前调用,视图布局可以在视图出现后更改(例如响应设备旋转)。
问题的原因默认是UIViewController
的view
有FlexibleWidth
&
FlexibleHeight
bController
和 cController
的 view
有额外的 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))
}