我需要显示横幅视图以显示消息,
现在,消息的内容可能会有所不同,并且视图的大小也应根据UILabel
的内容进行调整。
UILabel
设置为Word Wrap
,而numberOfLines
设置为0
相应的类文件是
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()
,但对我来说不起作用。
任何建议将不胜感激。
答案 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)
答案 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)
])
答案 3 :(得分:0)