ViewController以编程方式添加了转换/转换(iOS,swift,storyboards)

时间:2015-10-20 15:15:40

标签: ios iphone swift uiviewcontroller

我正在使用swift和storyboard了解View Controller Containers并在iOS中嵌套Viev控制器。 问题是 - 添加的视图不在父视图的范围内。 这是它在界面构建器中的外观: Screens 左视图是父视图控制器,白色区域是视图,我想在其中放置蓝色视图控制器。 我想,蓝色视图控制器应填充此白色视图。 但是,这就是它在iPad上的外观: enter image description here

它看起来像蓝色视图放置在白色视图顶部下方相同数量的像素,就像屏幕顶部的白色视图一样。

以下是代码:

class ViewController: UIViewController {


@IBOutlet weak var vcContainer: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    var vc = self.storyboard?.instantiateViewControllerWithIdentifier("TestViewController")
    displayVC(vc!)

}

func displayVC(content: UIViewController) {
    content.view.frame = self.vcContainer.frame
    content.view.setNeedsLayout()
    self.vcContainer.addSubview(content.view)

    self.addChildViewController(content)

    content.didMoveToParentViewController(self)

}

}

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:3)

这一行:self.vcContainer.addSubview(content.view)

应为self.view.addSubview(content.view)

因为当您为子视图控制器设置框架时,如下所示:

content.view.frame = self.vcContainer.frame

它与父视图控制器相关,而不是vcContainer,因此在将content添加到vcContainer之后,它处于错误的位置。

如果您想将content添加到vcContainer,则应选择另一种方式content.view,例如content的边缘到vcContainer的边缘使用NSLayoutConstraint

完整的工作代码:

UIViewController *vc =
    [self.storyboard instantiateViewControllerWithIdentifier:@"vc"];

[self addChildViewController:vc];

vc.view.translatesAutoresizingMaskIntoConstraints = NO;
[self.container addSubview:vc.view];
[self.container addConstraint:[NSLayoutConstraint
                                  constraintWithItem:vc.view
                                           attribute:NSLayoutAttributeTop
                                           relatedBy:NSLayoutRelationEqual
                                              toItem:self.container
                                           attribute:NSLayoutAttributeTop
                                          multiplier:1.0
                                            constant:0]];
[self.container addConstraint:[NSLayoutConstraint
                                  constraintWithItem:vc.view
                                           attribute:NSLayoutAttributeBottom
                                           relatedBy:NSLayoutRelationEqual
                                              toItem:self.container
                                           attribute:NSLayoutAttributeBottom
                                          multiplier:1.0
                                            constant:0]];
[self.container
    addConstraint:[NSLayoutConstraint
                      constraintWithItem:vc.view
                               attribute:NSLayoutAttributeLeading
                               relatedBy:NSLayoutRelationEqual
                                  toItem:self.container
                               attribute:NSLayoutAttributeLeading
                              multiplier:1.0
                                constant:0]];
[self.container
    addConstraint:[NSLayoutConstraint
                      constraintWithItem:vc.view
                               attribute:NSLayoutAttributeTrailing
                               relatedBy:NSLayoutRelationEqual
                                  toItem:self.container
                               attribute:NSLayoutAttributeTrailing
                              multiplier:1.0
                                constant:0]];
[vc didMoveToParentViewController:self];

如果使用PureLayout,则添加约束会更容易。

答案 1 :(得分:1)

视图中StoryBoard中设置的约束指定了从顶部保留的确切距离。

这个距离适用于某些设备,所以它可能看起来像是在中间,但在ipad上却不是这样。

您应该在视图上添加一个高度,而不是垂直和水平放置到超级视图的中心。