ios - 约束并没有扩大我对方向变化的看法

标签 ios swift uiscrollview constraints

我是这样创建 View 的:

    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 的宽度以使其成为新布局?

最佳答案

你应该替换

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 的宽度和高度,而不是将容器 View 拉伸(stretch)到 ScrollView 的右侧和底部。它似乎工作得更好。我还根据文档将约束添加到一个共同的祖先,但它也可以通过添加到 scrollView 来工作,因此请选择是否要将所有约束添加到 View 而不是 scrollView。

进一步说明

在 iOS 8 及更高版本中,您可以简单地激活您的约束,而不是将它们添加到您的 View 中。

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

在我更喜欢的 iOS 9 中,您可以使用 anchor ,例如

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

您不需要在 layoutSubviews 中做任何事情。 translatesAutoresizingMaskIntoConstraints 属性确实应该设置为 false 而不是 true。

关于ios - 约束并没有扩大我对方向变化的看法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35919679/

相关文章:

ios - SDWeb图像滚动

ios - 旋转设备后动画点会重新定位

objective-c - 动画后旋转

ios - 响应式布局在 iPhone 7 和 iPad 7 中无法正确缩放

objective-c - 如何在iOS编程中获取时间

ios - 如何在 iOS Swift 中实现 Firebase Microsoft OAuth?

SwiftUI View Builder 参数无法更改状态

ios - Swift 中的推送通知和 token 设备

iphone - 为什么 UIViewController 在屏幕上被释放

ios - 从右到左语言的 UIScrollView 方向 RTL