获取超过一行的 UILabel 的垂直大小?
Posted
技术标签:
【中文标题】获取超过一行的 UILabel 的垂直大小?【英文标题】:Get the vertical Size of a UILabel which has more than one line? 【发布时间】:2015-05-31 15:28:53 【问题描述】:我有一个多行的 UILabel:
let serviceDescription: UILabel = UILabel() serviceDescription.text =
"some very long text..."
serviceDescription.numberOfLines = 0
serviceDescription.sizeToFit()
self.contentView.addSubview(serviceDescription)
然后我添加一些自动布局约束:
serviceDescription.snp_makeConstraints (make) -> Void in
make.top.equalTo(self.contentView_snp_top).offset(24)
make.left.equalTo(self.contentView).offset(20)
make.right.equalTo(self.contentView).offset(-20)
现在我想计算这个标签在屏幕上需要的大小,所以我做了:
let newSize: CGSize = serviceDescription.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
println("serviceDescription size: \(newSize)")
结果是:
(3408.0, 95.5)
我在 viewDidLoad() 中执行了所有前面的命令。
如何在屏幕上获得正确尺寸的标签?
【问题讨论】:
如果您使用的是 AutoLayout,为什么需要确定标签需要多少空间?它会自行调整大小。 它不像我描述的那样工作。没有内容视图。 【参考方案1】:不需要计算高度,标签放好后就知道高度了,
override func viewDidLoad()
super.viewDidLoad()
println(label.frame.height) // 21
label.text = "Some long text to make the text go over more than one line"
label.layoutIfNeeded()
println(label.frame.height) // 101.5
【讨论】:
我需要做什么才能让 contentView 自动调整? @confile,标签需要对内容视图的顶部和底部有约束,才能使其随标签展开。 在我的 contentView 中,我有一个 UIView 和两个 UILabel。我必须如何布局哪一个? @confile,这与我回答的问题不同。如果你需要这方面的帮助,你应该问一个新问题。您需要包括这些 UI 元素在内容视图中的排列方式,以及您是否对它们中的任何一个有任何大小限制。 @confile 在这种情况下,我认为没有任何实际区别。标签将自行调整大小而不调用sizeToFit
,但直到运行循环的另一轮;调用layoutIfNeeded
会强制它立即进行布局,以便在下一行正确记录。我想在某些情况下,如果不调用 sizeToFit
,视图不会自行调整大小,但我想不出一个。以上是关于获取超过一行的 UILabel 的垂直大小?的主要内容,如果未能解决你的问题,请参考以下文章
在iOS中使用autolayout调整内容大小的UILabel