要用纯代码编写一个包含两个 UILabel 的界面,其中上面的 UILabel 是固定的,而下面的 UILabel 根据文本内容自适应换行,可以使用 Auto Layout 来实现。
import UIKit
class ViewController: UIViewController {
let fixedLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "固定标签"
label.textAlignment = .center
label.backgroundColor = .lightGray
return label
}()
let dynamicLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "这是一段动态文本,可以根据内容自适应换行。这是一段动态文本,可以根据内容自适应换行。这是一段动态文本,可以根据内容自适应换行。"
label.numberOfLines = 0
label.textAlignment = .center
label.backgroundColor = .yellow
return label
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
// 添加子视图
view.addSubview(fixedLabel)
view.addSubview(dynamicLabel)
// 设置 Auto Layout 约束
setupConstraints()
}
func setupConstraints() {
// 固定标签的约束
NSLayoutConstraint.activate([
fixedLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
fixedLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
fixedLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
fixedLabel.heightAnchor.constraint(equalToConstant: 50)
])
// 动态标签的约束
NSLayoutConstraint.activate([
dynamicLabel.topAnchor.constraint(equalTo: fixedLabel.bottomAnchor, constant: 20),
dynamicLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
dynamicLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
dynamicLabel.bottomAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20)
])
}
}
如果是左右布局的情况下:
func setupConstraints() {
// 左侧标签的约束
NSLayoutConstraint.activate([
leftLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
leftLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
leftLabel.widthAnchor.constraint(equalToConstant: 100), // 固定宽度
leftLabel.heightAnchor.constraint(equalToConstant: 50)
])
// 右侧标签的约束
NSLayoutConstraint.activate([
rightLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
rightLabel.leadingAnchor.constraint(equalTo: leftLabel.trailingAnchor, constant: 20),
rightLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
rightLabel.bottomAnchor.constraint(greaterThanOrEqualTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20)
])
}
如用到了等比例:
func setupConstraints() {
// 左侧标签的约束
NSLayoutConstraint.activate([
leftLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
leftLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
leftLabel.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.3), // 等比例宽度
leftLabel.heightAnchor.constraint(equalToConstant: 50)
])
// 右侧标签的约束
NSLayoutConstraint.activate([
rightLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
rightLabel.leadingAnchor.constraint(equalTo: leftLabel.trailingAnchor, constant: 20),
rightLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
rightLabel.bottomAnchor.constraint(greaterThanOrEqualTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -20)
])
}