iOS,scrollView内容大小的高度等于内容视图的高度,但它仍然可以垂直滚动?

时间:2017-01-23 06:44:01

标签: ios uiscrollview autolayout masonry-ios-osx

type

self是一个自定义视图。 我设置了这样的约束。难道我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:0)

底线,如果您明确定义内容视图和滚动视图之间的约束(将根据TN2154定义contentSize),然后明确定义内容视图与其之间的约束子视图,然后,是的,它将正确定义滚动视图的contentSize

的大小

我建议使用视图调试器enter image description here,并查看右侧面板中的约束:

view debugger

在特定的屏幕快照中,我在滚动视图内的内容视图中选择了第三个子视图(深蓝色),它告诉我们活动约束是:

  • 从容器前缘偏移10(绿色)
  • 从容器的后缘偏移10(绿色)
  • 从上面的子视图偏移10(深红色)
  • 固定高度为200(我这样做,因为它没有隐含高度)
  • 主视图的宽度(亮红色)少20(因此它占据适当的水平空间量,同样因为没有隐式宽度)
  • 从下面的子视图中偏移10(淡蓝色)

因此,您只需单击各种子视图和容器,并确认约束正是您的意图。很容易错过约束和/或无法激活约束,整个事情就崩溃了。

顺便说一下,有时候看约束的视图并不明显,但是如果点击约束按钮enter image description here,当选择一个视图时,它会突出显示你有约束的视图(在此示例中,内容视图,上方和下方的子视图以及主视图;由于滚动视图(黄色)和第一个子视图(紫色)都没有对此第三个子视图的任何约束,因此您只需看到它们线框,而不是它们的内容):

enter image description here

请注意,这是一个示例,我认为我会向您展示我使用的约束,以便自动布局可以基于内容视图和具有完全满意,明确约束的子视图正确计算contentSize:< / p>

let contentView = ContentView()
contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.backgroundColor = randomColor()
scrollView.addSubview(contentView)

NSLayoutConstraint.activate([
    contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
    contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
    contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
    contentView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor)
])

var previousView: UIView?

for _ in 0 ..< 4 {
    let subview = SomeSubview()
    subview.translatesAutoresizingMaskIntoConstraints = false
    subview.backgroundColor = self.randomColor()
    contentView.addSubview(subview)

    NSLayoutConstraint.activate([
        subview.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),
        subview.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10),
        subview.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -20),
        subview.heightAnchor.constraint(equalToConstant: 200)
    ])

    if previousView != nil {
        subview.topAnchor.constraint(equalTo: previousView!.bottomAnchor, constant: 10).isActive = true
    } else {
        subview.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
    }

    previousView = subview
}

previousView?.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true

在您的示例中,令我感到奇怪的是,您设置了edges(我假设设置了顶部,底部,前导和尾随约束)和height。不需要设置内容视图的高度。你可以定义边缘,你应该很好。高度取决于其子视图的约束。

如果您的子视图显示布局正确但滚动视图的contentSize未正确设置,那么罪魁祸首可能是最后一个子视图与您的内容视图之间缺少底部约束。

如果您仍然遇到问题,我建议您创建simplified, yet complete example问题。您共享的代码不足。但我们也不希望看到您的所有代码或特定的UI。相反,创建一个独立的简化示例,以显示您描述的问题。只有我们能够重现您的问题,我们才能帮助您解决问题。