我可以初始化我的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
}
}
答案 0 :(得分:0)
您的问题是,当调用translatesAutoresizingMaskIntoConstraints
时,忽略/覆盖.frame或.frame.size等方法(取决于您在translatesAutoresizingMaskIntoConstraints之前或之后使用它们的时间)。
如Apple所述:
请注意,自动调整遮罩约束会完全指定视图 大小和位置;因此,您无法添加其他约束 修改此大小或位置而不引入冲突。如果你 想要使用自动布局来动态计算大小和位置 在您的视图中,您必须将此属性设置为false,然后提供一个 视图的非模糊,非冲突的约束集。
在此post
中有详细描述原因是使用.frame
实际上最终会创建autoLayout约束,当您将translatesAutoresizingMaskIntoConstraints
设置为false时会删除这些约束。因此,您需要决定使用set .frame方法,还是仅使用约束。
为了简单起见,我通常最终会做的是在大型视图上使用.frame
(比如可能占用整个屏幕的UIView以及需要在后面移动的UIView),以及以编程方式在其子视图上使用autolayout,这些子视图可能不会在该较大视图中进行动画处理。
另外,请注意不止一次调用布局方法,它可以根据调用的时间覆盖某些内容。