我的UITextViewiOS 应用程序中有一个,它显示大量文本。
UITextView
然后,我使用UITextView.
我的问题是填充UITextView使我的计算感到困惑,因为它似乎因我使用的字体大小和字体而异。
是否可以删除围绕内容的填充UITextView?
它是 iOS 中最愚蠢的错误之一。
这里给出的类UITextViewFixed, 被广泛使用,通常是总体上最合理的解决方案。
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:
请注意,您当然必须…
(开启 scrollEnabled 的意思是“通过尽可能扩大底部边距,让这个视图尽可能垂直扩大。”)
(1) 在一些非常不寻常的情况下动态改变高度,苹果做了一件奇怪的事情:他们在底部增加了额外的空间。
不完全是!这一定是 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.
.lineFragmentPadding = 0
但是......信不信由你......这在当前的iOS中不起作用!(检查 2021。)将来可能需要添加该行。
在 iOS 中被破坏的事实UITextView是所有移动计算中最奇怪的事情之一。这个问题十周年了,它仍然没有解决!
最后,这里有一个类似 Text Field的提示:Set the maximum character length of a UITextField in Swift
您经常使用“像 UILabel”一样的 UITextView。因此,您希望它使用省略号“…”截断文本
如果是这样,请添加:
textContainer.lineBreakMode = .byTruncatingTail
通常,您使用文本视图仅显示文本。因此,您使用行“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 比 UITextView 有很多优势。UILabel 不会遇到此问答页面中描述的问题。
事实上,我们通常“放弃”而只使用 UITextView 的原因是 UILabel 很难使用。特别是要正确地向 UILabel添加padding是非常困难的。
事实上,这里是关于如何“最终”正确地向 UILabel 添加填充的完整讨论:向 UILabel添加空间/填充。在某些情况下,如果您正在使用动态高度单元格进行困难的布局,有时最好使用 UILabel 进行困难的布局。