2021 年最新版本
这是 iOS 中最愚蠢的错误之一。
这里给出的类 UITextViewFixed 被广泛使用,通常是总体上最合理的解决方案。
这是课程:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
不要忘记在 Inspector 中关闭 scrollEnabled!
-
该解决方案在情节提要中正常工作
-
解决方案在运行时正常工作
就是这样,你完成了。
一般而言,在大多数情况下应该就是您所需要的全部。
即使您动态地更改文本视图的高度,UITextViewFixed 通常也能满足您的所有需求。
(动态更改高度的一个常见示例是在用户键入时更改它。)
这是 Apple 损坏的 UITextView...
这里是UITextViewFixed:
请注意,您当然必须...
...在 Inspector 中关闭 scrollEnabled!
(开启scrollEnabled的意思是“通过尽可能扩大下边距,让这个视图在垂直方向尽可能扩大。”)
一些进一步的问题
(1) 在一些非常不寻常的情况下动态改变高度,Apple 做了一件奇怪的事情:他们在底部添加了额外的空间。
不,真的!这一定是 iOS 中最令人愤怒的事情之一。
如果您遇到问题,这里有一个“快速修复”,通常会有所帮助:
...
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
// this is not ideal, but sometimes this "quick fix"
// will solve the "extra space at the bottom" insanity:
var b = bounds
let h = sizeThatFits(CGSize(
width: bounds.size.width,
height: CGFloat.greatestFiniteMagnitude)
).height
b.size.height = h
bounds = b
...
(2) 在极少数情况下,要修复 Apple 的另一个微妙问题,您必须添加:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false) // sic
}
(3) 可以说,我们应该添加:
contentInset = UIEdgeInsets.zero
就在.lineFragmentPadding = 0 之后UITextViewFixed。
但是……不管你信不信……在当前的 iOS 中根本行不通! (2021 年检查。)将来可能需要添加该行。
UITextView 在 iOS 中被破坏的事实是所有移动计算中最奇怪的事情之一。这个问题十周年了,还没有解决!
最后,这里有一个与 TextField 有点相似的提示:Set the maximum character length of a UITextField in Swift
完全随机提示:如何在末尾添加“...”
您经常使用“像 UILabel”一样的 UITextView。因此,您希望它使用省略号“...”来截断文本
如果有,请添加:
textContainer.lineBreakMode = .byTruncatingTail
如果你想要 0 高度的小贴士,什么时候根本没有 文字
您经常使用文本视图来仅显示文本。因此,您使用行“0”表示文本视图将根据文本行数自动更改高度。
那太好了。但是如果根本没有文字,那么不幸的是你得到的高度就好像只有一行文字!!!!文本视图永远不会“消失”。
如果你想让它“消失”,只需添加这个
override var intrinsicContentSize: CGSize {
var i = super.intrinsicContentSize
print("for \(text) size will be \(i)")
if text == "" { i.height = 1.0 }
print(" but we changed it to \(i)")
return i
}
(我将它设为“1”高度,所以演示中发生了什么很清楚,“0”很好。)
UILabel 呢?
当只是显示文本时,UILabel 比 UITextView 有很多优势。 UILabel 没有遇到此问答页面中描述的问题。
确实,我们通常“放弃”而只使用 UITextView 的原因是 UILabel 难以使用。特别是要正确地向 UILabel 添加 padding 是非常困难的。
事实上,这里是关于如何“最终”正确地向 UILabel 添加填充的完整讨论:Adding space/padding to a UILabel。在某些情况下,如果您正在使用动态高度单元格进行困难的布局,有时最好使用 UILabel 进行困难的布局。