回答2017...
c = CGSize(width: yourWidth, height: CGFloat.greatestFiniteMagnitude)
结果 = sizeThatFits(c).height
所以...
let t = .... your UITextView
let w = .... your known width of the item
let trueHeight = t.sizeThatFits(
CGSize(width: t, height: CGFloat.greatestFiniteMagnitude)).height
就是这样。
很多时候,您想知道与“正常”单行条目相比的高度差异。
如果您正在制作某种与 UTableView 无关的单元格(例如,某种自定义堆栈视图),则尤其会出现这种情况。您必须在某些时候手动设置高度。在您的故事板上,使用任何短字符串(例如“A”)的示例文本按照您的意愿构建它,在任何正常情况下当然只有一行。然后你做这样的事情......
func setTextWithSizeCorrection() { // an affaire iOS
let t = .... your UITextView
let w = .... your known width of the item
let oneLineExample = "A"
let actualText = yourDataSource[row].description.whatever
// get the height as if with only one line...
experimental.text = oneLineExample
let oneLineHeight = t.sizeThatFits(
CGSize(width: w, height: CGFloat.greatestFiniteMagnitude)).height
// get the height with the actual long text...
// (note that usually, you do not want a one-line minimum)
experimental.text = (actualText == "") ? oneLineExample : actualText
let neededHeight = t.sizeThatFits(
CGSize(width: w, height: CGFloat.greatestFiniteMagnitude)).height
experimental.text = actualText
let delta = neededHeight - oneLineHeight
set the height of your cell, or whatever it is(standardHeight + delta)
}
最后一点:iOS 中真正愚蠢的事情之一是 UITextView 内部有一种奇怪的边距。这意味着您不能只在 UITextViews 和标签之间进行交换;它会导致许多其他问题。截至撰写本文时,Apple 尚未解决此问题。解决这个问题很困难:以下方法通常是可以的:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero;
textContainer.lineFragmentPadding = 0;
}
}
来自Apple的破碎,无法使用的UITextView......
UITextViewFixed
在大多数情况下,这是一个可以接受的修复:
(为清楚起见,添加了黄色。)