UIPageViewController和AutoLayout:约束未正确应用

时间:2014-09-01 04:21:57

标签: ios autolayout uipageviewcontroller

我以编程方式创建UIPageViewController并将其作为子项添加到我的容器视图控制器中,如下所示:

    override func viewDidLoad() {
    super.viewDidLoad()

    self.pageViewController = UIPageViewController(transitionStyle:.PageCurl, navigationOrientation:.Horizontal, options: nil)

    self.mainImageView!.userInteractionEnabled = true

    self.pageViewController.delegate = self
    self.pageViewController.dataSource = self.modelController

    self.addChildViewController(self.pageViewController)
    self.view.addSubview(self.pageViewController.view)

    self.pageViewController.didMoveToParentViewController(self)

}        

问题是UIPageViewController的视图大小不正确,如下面的视图层次结构所示。 UIPageViewController的数据源返回的视图控制器包含单个UIScrollView。我已经设置了UIScrollView的约束,以便scrollView扩展到superview。

在我看来,问题源于scrollView约束是"分离"从容器视图的约束,但我不知道如何使用StoryBoard修复它,因为这些是不同视图控制器中的视图。我不是很熟悉以编程方式指定约束,到目前为止,我以编程方式设置约束的努力都失败了。

如何解决此问题,以便UIPageViewController的视图控制器的滚动视图正确包含在容器ViewController的视图中?

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

我必须以编程方式添加约束来解决问题。请注意,我无法使用IB添加自动布局约束,因为我在这里处理属于IB中两个不同视图控制器的两个视图。视图以编程方式添加为子视图,因为它们是UIPageViewController的视图。

    override func viewDidLayoutSubviews() {
    self.pageViewController.view.setTranslatesAutoresizingMaskIntoConstraints(false)

    // Equal height constraint
    let constraint = NSLayoutConstraint(item: self.mainImageView!, attribute: .Height, relatedBy: .Equal, toItem: self.pageViewController.view, attribute: .Height, multiplier: 1.0, constant: 0)
    self.view.addConstraint(constraint)

    // Equal width constraint
    let constraint1 = NSLayoutConstraint(item: self.mainImageView!, attribute: .Width, relatedBy: .Equal, toItem: self.pageViewController.view, attribute: .Width, multiplier: 1.0, constant: 0)
    self.view.addConstraint(constraint1)

    // Equal top constraint
    let constraint2 = NSLayoutConstraint(item: self.mainImageView!, attribute: .Top, relatedBy: .Equal, toItem: self.pageViewController.view, attribute: .Top, multiplier: 1.0, constant: 0)
    self.view.addConstraint(constraint2)

    self.view.layoutSubviews()
}

答案 1 :(得分:2)

我遇到了同样的问题,通过在viewDidLoad()

中添加以下代码解决了这个问题
pageViewController!.view.setTranslatesAutoresizingMaskIntoConstraints(false)
    let views = ["pageView": pageViewController!.view]

    var constH = NSLayoutConstraint.constraintsWithVisualFormat("H:|[pageView]|", options: .AlignAllCenterY, metrics: nil, views: views)
    view.addConstraints(constH)
    var constW = NSLayoutConstraint.constraintsWithVisualFormat("V:|[pageView]|", options: .AlignAllCenterX, metrics: nil, views: views)
    view.addConstraints(constW)

我希望能帮助别人。