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

时间:2019-01-10 09:57:24

标签: ios swift uiview autolayout constraints

我需要显示横幅视图以显示消息,

现在,消息的内容可能会有所不同,并且视图的大小也应根据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被实现为UIView的扩展名,

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 个答案:

答案 0 :(得分:1)

您可能想尝试以下代码,

创建一个方法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中以进行代码优化。 [可选]

希望有帮助。

答案 1 :(得分:0)

  1. 删除尾随或前导约束
  2. 通过编程设置大小以适合属性

答案 2 :(得分:0)

我希望班级看起来像

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)

])

Add-CMAppv5XDeploymentType

答案 3 :(得分:0)

新用户的自动布局,总是忘记了两个有用的约束:

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

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

尝试使用优先级参数