无法将子视图添加到滚动视图

我能够初始化我的滚动视图,并设置其contentSize与背景颜色…一切工作正常,当这样做,但是当我利用下面的代码添加子视图scrollView IM无法看到这些意见…请帮助吗?

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和override 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 } } 

你的问题是,当调用translatesAutoresizingMaskIntoConstraints时,像.frame或.frame.size这样的方法被忽略/重写(取决于你在使用它们的时候,在translatesAutoresizingMaskIntoConstraints之前或之后)。 正如苹果所述 :

请注意,自动调整遮罩约束完全指定视图的大小和位置; 因此,您不能添加其他约束来修改此大小或位置而不引起冲突。 如果要使用“自动布局”来dynamic计算视图的大小和位置,则必须将此属性设置为false,然后为视图提供非歧义的,不冲突的一组约束。

并在这篇文章中很好地描述

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

为了简单起见,我通常最终要做的就是在大规模视图上使用.frame (比如UIView可能占用整个屏幕,并且需要在后者上移动),并以编程方式在其子视图上使用自动布局,这可能不是在更大的视野内animation。

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