将子视图布局锚点设置为UIScrollView

时间:2018-06-08 05:19:46

标签: swift uiscrollview nslayoutanchor

当我想在UIScrollView中设置我的子视图的顶部锚点时,我必须给它们一个恒定的高度,否则scrollView将不会滚动。但随着它们数量的增长,感觉就像一团糟。

例如,如果我将第二个子视图“topAnchor设置为第一个bottomAnchor,则不会滚动。我必须将它们设置为scrollView的锚点。 有没有更好的方法来实现这一目标,而不是自己计算距离并计算距离?

这是我的scrollView:

    scrollView.translatesAutoresizingMaskIntoConstraints = false
    scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: 500)
    scrollView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    scrollView.isScrollEnabled = true

    belowContainer.addSubview(scrollView)

    scrollView.topAnchor.constraint(equalTo: belowContainer.topAnchor, constant: 20).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: belowContainer.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: belowContainer.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: belowContainer.bottomAnchor, constant: 0).isActive = true

我使用以下变量在子视图之间获得正确的垂直间距

    var counter : CGFloat = 0; // height space counter between uiItems below!
    let multiplierHeight : CGFloat = 32 // we multiply our counter by this value to get the right spacing!

最后我将我的子视图锚定在这样的for循环中:

    for lbl in labelsArray {
        lbl.font = UIFont(name: fontName, size: 20)

        lbl.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: counter * multiplierHeight).isActive = true          
        lbl.heightAnchor.constraint(equalToConstant: 25).isActive = true
        counter += 1
    }

1 个答案:

答案 0 :(得分:1)

这似乎不是解决您问题的正确方法。相反,您应该对标签进行级联,以便将一个标签的底部约束链接到下一个标签的顶部约束。这样,您就不必进行顶部约束常数乘法。

但是,您可能需要考虑使用堆栈视图来实现目标。使用约束将堆栈视图固定到滚动视图的内容视图,然后使用for循环将标签添加到堆栈视图:

stackView.addArrangedSubview(lbl)

堆栈视图的优点是您不需要单个布局约束。相反,堆栈视图本身负责定位其子视图。