Swift Auto Layout的基本使用

要用纯代码编写一个包含两个 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)
        ])
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值