约束不会扩展我的方向更改视图

时间:2016-03-10 14:46:17

标签: ios swift uiscrollview constraints

我创建了我的视图:

    self.scrollView = UIScrollView()
    self.scrollView.delegate = self
    self.scrollView.contentSize = CGSizeMake(UIScreen.mainScreen().bounds.width, 1000)

    containerView = UIView()
    containerView.backgroundColor = UIColor.redColor()

    scrollView.translatesAutoresizingMaskIntoConstraints    = false
    containerView.translatesAutoresizingMaskIntoConstraints = false

    scrollView.addSubview(containerView)
    view.addSubview(scrollView)

然后我添加了这些约束:

    // Constraint ScrollView
    view.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: 0.0))
    view.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1.0, constant: 0.0))
    view.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1.0, constant: 0.0))
    view.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .Trailing, relatedBy: .Equal, toItem: view, attribute: .Trailing, multiplier: 1.0, constant: 0.0))

    // Constraint ContainerView
    scrollView.addConstraint(NSLayoutConstraint(item: containerView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0.0))
    scrollView.addConstraint(NSLayoutConstraint(item: containerView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0.0))
    scrollView.addConstraint(NSLayoutConstraint(item: containerView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0.0))
    scrollView.addConstraint(NSLayoutConstraint(item: containerView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0.0))

而且:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    scrollView.frame    = view.bounds
    containerView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)
}

但是当我改变方向时,containerView的宽度保持不变。如何确保宽度扩展到scrollView到新布局的宽度?

2 个答案:

答案 0 :(得分:1)

你应该替换

scrollView.addConstraint(NSLayoutConstraint(item: containerView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0.0))
scrollView.addConstraint(NSLayoutConstraint(item: containerView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0.0))

view.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Height, relatedBy: .Equal, toItem: scrollView, attribute: .Height, multiplier: 1.0, constant: 0.0))
view.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0.0))

这使用滚动视图的宽度和高度,而不是将容器视图拉伸到滚动视图的右侧和底部。它似乎工作得更好。我还根据文档将约束添加到共同的祖先,但它也可以通过添加到scrollView来工作,因此您可以选择是否要将所有约束添加到视图而不是滚动视图。

进一步说明

在iOS 8及更高版本中,您只需激活约束,而不是将其添加到视图中。

NSLayoutConstraint(item: containerView, attribute: .Top, relatedBy: .Equal, toItem: scrollView, attribute: .Top, multiplier: 1.0, constant: 0.0).active = true

在iOS 9中,我更喜欢你可以使用锚点,例如

scrollView.topAnchor.constraintEqualToAnchor(topLayoutGuide.bottomAnchor).active = true

您无需在layoutSubviews中执行任何操作。 translatesAutoresizingMaskIntoConstraints属性确实应设置为false NOT true。

答案 1 :(得分:0)

你还应该添加这些约束

containerView.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Top, relatedBy: .Equal, toItem: scrollView, attribute: .Top, multiplier: 1.0, constant: 0.0))
containerView.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Bottom, relatedBy: .Equal, toItem: scrollView, attribute: .Bottom, multiplier: 1.0, constant: 0.0))
containerView.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Leading, relatedBy: .Equal, toItem: scrollView, attribute: .Leading, multiplier: 1.0, constant: 0.0))
containerView.addConstraint(NSLayoutConstraint(item: containerView, attribute: .Trailing, relatedBy: .Equal, toItem: scrollView, attribute: .Trailing, multiplier: 1.0, constant: 0.0))