美文网首页iOS学习
iOS-设置宽度约束(内容抗压缩)优先级

iOS-设置宽度约束(内容抗压缩)优先级

作者: AndyGF | 来源:发表于2020-09-08 11:57 被阅读0次

在 iOS 开发中, 常用的约束框架有两个 OC版的 Masonry, Swift 版的 SnapKit, 这两个框架出自同一个团队. 此例用 Swift 在 6p 真机上演示.
在开发中我们经常会遇到这样一种情况, 在同一行的位置一有两个 UILabel 控件, 左边 nameLB 和 右边 numberLB, 宽度都自适应, 分别设置与屏幕两边的边距, 如果两个 label 宽度, 以及 间距 的总和不超过屏幕宽度, 那么一切正常, 但是当超过屏幕宽度时, numberLB 会被压缩, 先看看默认的效果.

默认布局代码

import UIKit

import SnapKit


class ViewController: UIViewController {

    
    private lazy var nameLB: UILabel = {
        let lb = UILabel(frame: .zero)
        lb.text = "我是书的名称: 红楼梦红楼梦红楼梦"
        lb.font = UIFont.systemFont(ofSize: 20.0)
        lb.textColor = UIColor.red
        lb.backgroundColor = .gray
        return lb
    }()
    
    private lazy var numberLB: UILabel = {
        let lb = UILabel(frame: .zero)
        lb.text = "9999 人次阅读"
        lb.font = UIFont.systemFont(ofSize: 20.0)
        lb.textColor = UIColor.cyan
        lb.backgroundColor = .gray
        return lb
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupUI()
    }

    private func setupUI() {
        
        view.backgroundColor = .yellow
        
        view.addSubview(nameLB)
        view.addSubview(numberLB)
        
        nameLB.snp.makeConstraints { (make) in
            make.centerY.equalTo(view)
            make.left.equalTo(view).offset(20.0)
            make.right.lessThanOrEqualTo(numberLB.snp.left).offset(-10.0)
        }
        
        numberLB.snp.makeConstraints { (make) in
            make.right.equalTo(view).offset(-20.0)
            make.centerY.equalTo(view)
        }
    }
}

默认情况下效果

默认情况下效果

此时如果我们的需求是压缩左边 nameLB, 保证 右边 numberLB 完全展示, 我们该怎么办呢 ?

降低 nameLB 内容的抗压缩优先级即可
setupUI() 中设置

private func setupUI() {
        
        view.backgroundColor = .yellow
        
        // 设置内容抗压缩优先级
        nameLB.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

        view.addSubview(nameLB)
        view.addSubview(numberLB)
        
        nameLB.snp.makeConstraints { (make) in
            make.centerY.equalTo(view)
            make.left.equalTo(view).offset(20.0)
            make.right.lessThanOrEqualTo(numberLB.snp.left).offset(-10.0)
        }
        
        numberLB.snp.makeConstraints { (make) in
            make.right.equalTo(view).offset(-20.0)
            make.centerY.equalTo(view)
        }
    }

设置后的效果图

设置后的效果图

注意:

  • 本文是以 UILabel 为例演示, 实际上只要是 UIView 及其子类都是可以的, setContentCompressionResistancePriority 是 UIView 的 API.
    UIView API

相关文章

网友评论

    本文标题:iOS-设置宽度约束(内容抗压缩)优先级

    本文链接:https://www.haomeiwen.com/subject/busdektx.html