代码之家  ›  专栏  ›  技术社区  ›  Bappaditya

通过自动布局根据UILabel的内容自动调整UIView的大小

  •  1
  • Bappaditya  · 技术社区  · 7 年前

    现在,消息的内容可能会有所不同,视图也应该根据需要调整大小 UILabel 它的内容。

    UILabel Word Wrap numberOfLines 设置为 0

    xib Auto layout Auto Layout 2

    相应的类文件是,

    import UIKit
    
    class ORABannerView: UIView {
    
        @IBOutlet weak var bannerText: UILabel!
    
        static func instantiate(message: String) -> ORABannerView {
            let view: ORABannerView = initFromNib() ?? ORABannerView()
            view.bannerText.text = message
            return view
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override func draw(_ rect: CGRect) {
            super.draw(rect)
        }
    }
    

    这个 initFromNib

    extension UIView {
        class func initFromNib<T: UIView>() -> T? {
            guard let view = Bundle.main.loadNibNamed(String(describing: self), owner: nil, options: nil)?[0] as? T else {
                return nil
            }
            return view
        }
    }
    

    layoutIfNeeded() 在视图上,但它对我不起作用。

    如有任何建议,将不胜感激。

    4 回复  |  直到 7 年前
        1
  •  1
  •   Bidhan Roy    7 年前

    您可能需要尝试以下代码,

    sizeHeaderToFit UIView 基于其内容的高度。

    private func sizeHeaderToFit(headerView: UIView?) -> CGFloat {
           guard let headerView = headerView else {
               return 0.0
           }
    
           headerView.setNeedsLayout()
           headerView.layoutIfNeeded()
    
           let height = headerView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
    
           return height
       }
    

    sizeHeaderToFit(headerView: yourView)
    

    在里面 ORABannerView 类,添加覆盖 layoutSubviews

    override func layoutSubviews() {
           super.layoutSubviews()
           bannerText.preferredMaxLayoutWidth = bannerText.bounds.width
       }
    

    而且 xib 文件中,将约束保留为其 superview 而不是 safe area 用于代码优化。[可选]

    希望能有帮助。

        2
  •  0
  •   Satish Mavani    7 年前
    1. 删除尾部或前导约束
    2. 以编程方式设置大小以适应属性
        3
  •  0
  •   Bappaditya    7 年前

    我希望这个班看起来像

    class ORABannerView: UIView {
    
        @IBOutlet weak var bannerText: UILabel!
    
        static func instantiate(message: String) -> ORABannerView {
            let view: ORABannerView = initFromNib()
            view.bannerText.text = message
            return view
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override func draw(_ rect: CGRect) {
            super.draw(rect)
        }
    }
    

    let v = ORABannerView.instantiate(message: "djhhejjhsdjhdjhjhdshdsjhdshjdhjdhjdhjddhjhjdshjdhdjshjshjdshjdshjdshjdshjdsjhdshjds")
    
    self.view.addSubview(v)
    
    v.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
    
        v.topAnchor.constraint(equalTo: self.view.topAnchor,constant:50),
    
        v.leadingAnchor.constraint(equalTo: self.view.leadingAnchor,constant:0),
    
        v.trailingAnchor.constraint(equalTo: self.view.trailingAnchor,constant:0)
    
    ])
    

    enter image description here

        4
  •  0
  •   Bimawa    7 年前

    新用户autolayout总是忘记两个有用的约束:

    func setContentCompressionResistancePriority(UILayoutPriority, for: NSLayoutConstraint.Axis)
    func setContentHuggingPriority(UILayoutPriority, for: NSLayoutConstraint.Axis)
    

    它也存在于IB中: enter image description here

    尝试使用优先级参数