无法将子视图添加到scrollview

时间:2017-07-31 20:51:18

标签: ios swift

我可以初始化我的scrollview并使用背景颜色设置其contentSize ...一切正常,但是当我利用以下代码将子视图添加到scrollView时我无法看到那些视图...请帮助?

func setupViews(_ views: [NewView]) {
    var multiplier: CGFloat = 0.0
    let width = frame.size.width
    let height = frame.size.height
    for view in views {
        let newView = NewView()
        addSubview(newView)
        newView.frame = CGRect(x: width * multiplier, y: 0, width: width, height: height)
        newView.backgroundColor = .random()
        newView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
        newView.centerXAnchor.constraint(equalTo: centerXAnchor, constant: width * multiplier).isActive = true
        multiplier += 1
    }
    contentSize = CGSize(width: width * multiplier, height: height)
}

我在NewView类中有一个commonInit()函数,它在所需的init和amp;中调用。覆盖init,可能有帮助,所以这里是

private func commonInit() {
    translatesAutoresizingMaskIntoConstraints = false
    backgroundColor = UIColor.white

    let labels = [nameLabel, brandLabel, priceLabel]
    var multiplier: CGFloat = 0.0

    for label in labels {
        addSubview(label)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 10.0 * multiplier).isActive = true
        label.centerXAnchor.constraint(equalTo: centerXAnchor, constant: 0.0).isActive = true
        multiplier += 1.0
    }

}

1 个答案:

答案 0 :(得分:0)

您的问题是,当调用translatesAutoresizingMaskIntoConstraints时,忽略/覆盖.frame或.frame.size等方法(取决于您在translatesAutoresizingMaskIntoConstraints之前或之后使用它们的时间)。 如Apple所述:

  

请注意,自动调整遮罩约束会完全指定视图   大小和位置;因此,您无法添加其他约束   修改此大小或位置而不引入冲突。如果你   想要使用自动布局来动态计算大小和位置   在您的视图中,您必须将此属性设置为false,然后提供一个   视图的非模糊,非冲突的约束集。

在此post

中有详细描述

原因是使用.frame实际上最终会创建autoLayout约束,当您将translatesAutoresizingMaskIntoConstraints设置为false时会删除这些约束。因此,您需要决定使用set .frame方法,还是仅使用约束。

为了简单起见,我通常最终会做的是在大型视图上使用.frame(比如可能占用整个屏幕的UIView以及需要在后面移动的UIView),以及以编程方式在其子视图上使用autolayout,这些子视图可能不会在该较大视图中进行动画处理。

另外,请注意不止一次调用布局方法,它可以根据调用的时间覆盖某些内容。