我正在使用swift和storyboard了解View Controller Containers并在iOS中嵌套Viev控制器。 问题是 - 添加的视图不在父视图的范围内。 这是它在界面构建器中的外观: 左视图是父视图控制器,白色区域是视图,我想在其中放置蓝色视图控制器。 我想,蓝色视图控制器应填充此白色视图。 但是,这就是它在iPad上的外观:
它看起来像蓝色视图放置在白色视图顶部下方相同数量的像素,就像屏幕顶部的白色视图一样。
以下是代码:
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)
}
}
任何帮助将不胜感激。谢谢!
答案 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上却不是这样。
您应该在视图上添加一个高度,而不是垂直和水平放置到超级视图的中心。