从 iOS 9 开始,可以使用 UIStackViews 构建许多像这样的简单布局,UIStackViews 是管理子视图及其布局约束的容器视图,因此您不必这样做(就像怀旧评论家一样)。
除了概念简单之外,UIStackViews 对它们还有很多好处。它们性能良好,易于使用,并且可以轻松隐藏/显示视图,而无需手动操作和更新大量约束。
在本例中,您有两个 UILabels 和一个 UIImageView,它们以一定的间距堆叠在一起。如果我要实现这个布局,我会将两个标签组合在一个 UIStackView 中,将其添加到带有一些插图的 UIView 中,然后将该视图与 UIImageView 一起添加到另一个 UIStackView 中,如下所示:
UIStackView (1)
界面视图 (2)
UIStackView (3)
用户界面标签 (4)
用户界面标签 (5)
UI图像视图 (6)
并在代码中:
let containerStackView = UIStackView() // (1)
containerStackView.axis = .vertical
let greenLabel = UILabel() // (4)
greenLabel.text = "Hello,"
let blueLabel = UILabel() // (5)
blueLabel.text = "World!"
let textStackView = UIStackView() // (3)
textStackView.axis = .vertical
textStackView.spacing = 10
textStackView.addArrangedSubview(greenLabel)
textStackView.addArrangedSubview(blueLabel)
let textContainerView = UIView() // (2)
textContainerView.addSubview(textStackView)
textStackView.snp.makeConstraints { make in
make.edges.equalToSuperview().inset(20)
}
let imageView = UIImageView(image: UIImage(named: "my-image") // (6)
containerStackView.addArrangedSubview(textContainerView)
containerStackView.addArrangedSubview(imageView)
然后您需要将容器堆栈视图限制为 UITableViewCell 的内容视图:
contentView.addSubview(containerStackView)
containerStackView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
我就是这样做的。当然,您自己管理约束的方法同样有效,并且可以按如下方式完成:
contentView.addSubview(label1)
label1.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(20)
make.trailing.equalToSuperview().offset(-20)
make.top.equalToSuperview().offset(20)
}
contentView.addSubview(label2)
label2.snp.makeConstraints { make in
make.leading.equalToSuperview().offset(20)
make.trailing.equalToSuperview().offset(-20)
make.top.equalTo(label1.snp.bottom).offset(10)
}
contentView.addSubview(exampleImage)
exampleImage.snp.makeConstraints { make in
make.leading.trailing.bottom.equalToSuperview()
make.top.equalTo(label2.snp.bottom).offset(20)
}
请注意,我是在文本编辑器中编写的,因此可能存在一些拼写错误,但总体思路应该成立。