我的iOS应用程序中有一个UITextView
,它显示大量文本.
然后,我使用UITextView
的偏移页边距参数对此文本进行分页.
我的问题是,UITextView
的填充混淆了我的计算,因为根据我使用的字体大小和字样,它似乎是不同的.
是否可以移除UITextView
的内容物周围的填充物?
我的iOS应用程序中有一个UITextView
,它显示大量文本.
然后,我使用UITextView
的偏移页边距参数对此文本进行分页.
我的问题是,UITextView
的填充混淆了我的计算,因为根据我使用的字体大小和字样,它似乎是不同的.
是否可以移除UITextView
的内容物周围的填充物?
它是iOS中最愚蠢的漏洞之一.
这里给出的类,UITextViewFixed
,使用广泛,通常是most reasonable solution overall.
下面是班级:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
}
}
别忘了在判断器中关闭ScrollEnabled!
该解决方案在情节提要中正常工作
该解决方案在运行时正常工作
一般来说,that should be all you need in most cases.
即使您要更改文本视图的高度,on the fly和UITextViewFixed
通常也能满足您的所有需要.
(飞翔上更改高度的一个常见示例是随着用户的键入而更改高度.)
这是苹果公司损坏的UITextView...
下面是UITextViewFixed
条:
请注意,您当然必须...
(打开scroll Enabled意味着"通过尽可能扩大底部页边距,使此视图在垂直方向上尽可能地展开".)
(1) 在一些非常罕见的动态变化高度的情况下,苹果做了一件奇怪的事情:100.
不,真的!这肯定是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) 在极少数情况下,要解决苹果的另一个微妙问题,你必须补充:
override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
super.setContentOffset(contentOffset, animated: false) // sic
}
(3)可以说,我们should增加了:
contentInset = UIEdgeInsets.zero
UITextViewFixed
年刚过.lineFragmentPadding = 0
.
然而信不信由你...在当前的iOS中是100!(判断2021)将来可能有必要增加这一行.
在iOS中打破UITextView
是所有移动计算中最奇怪的事情之一.这个问题已经十周年了,现在还没有解决!
最后,这里是针对TextField的一个有点类似的提示:100
通常,您使用的UITextView"就像UILabel一样".所以你想让它用省略号来截断文本,"…"
如果是,请添加:
textContainer.lineBreakMode = .byTruncatingTail
通常,您使用文本视图仅显示文本.因此,您使用行"0"表示文本视图将根据文本的行数自动更改高度.
太好了.但是if there is no text at all,那么不幸的是你会得到同样高的as if there is one line of text!文本视图永远不会"消失".
如果你想让它"消失",只需添加这个
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:100添加填充的完整讨论.在某些情况下,如果您正在使用动态高度单元格进行困难的布局,有时使用UILabel进行困难的布局会更好.