我在我的iOS应用程序中有一个UITextView,它显示大量的文本。
然后,我通过使用UITextView的offset margin参数来分页此文本。
我的问题是UITextView的填充使我的计算感到困惑,因为它似乎是不同的,取决于我使用的字体大小和字体。
是否有可能移除UITextView内容周围的填充?
我在我的iOS应用程序中有一个UITextView,它显示大量的文本。
然后,我通过使用UITextView的offset margin参数来分页此文本。
我的问题是UITextView的填充使我的计算感到困惑,因为它似乎是不同的,取决于我使用的字体大小和字体。
是否有可能移除UITextView内容周围的填充?
当前回答
使用用户定义运行时属性的故事板或接口构建器解决方案:
iOS 7.1和iOS 6.1的截图内容为contentInset ={{-10, -5},{0,0}}。
其他回答
如果有人正在寻找最新的Swift版本,那么下面的代码可以很好地与Xcode 10.2和Swift 4.2一起工作
yourTextView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
这是一个简单的小扩展,将删除苹果的默认边际从每个文本视图在你的应用程序。
注意:界面构建器仍将显示旧的边缘,但你的应用程序将按预期工作。
extension UITextView {
open override func awakeFromNib() {
super.awakeFromNib();
removeMargins();
}
/** Removes the Apple textview margins. */
public func removeMargins() {
self.contentInset = UIEdgeInsetsMake(
0, -textContainer.lineFragmentPadding,
0, -textContainer.lineFragmentPadding);
}
}
对于iOS 7.0,我发现contentInset技巧不再有效。这是我在iOS 7中用来去除边距/填充的代码。
这将把文本的左边缘带到容器的左边缘:
textView.textContainer.lineFragmentPadding = 0
这将导致文本的顶部与容器的顶部对齐:
textView.textContainerInset = .zero
这两行都需要完全删除空白/填充。
这个解决方案是在2009年iOS 3.0发布时编写的。它不再适用。
我遇到了完全相同的问题,最后我不得不吸毒
nameField.contentInset = UIEdgeInsetsMake(-4, -8, 0, 0);
其中nameField是一个UITextView。我使用的字体是Helvetica 16号。这只是我所绘制的特定字段大小的自定义解决方案。这使得左偏移量与左侧齐平,以及我想要它被绘制的盒子的顶部偏移量。
此外,这似乎只适用于你使用默认对齐的UITextViews,即,
nameField.textAlignment = NSTextAlignmentLeft;
例如,向右对齐,UIEdgeInsetsMake似乎对右边缘没有任何影响。
至少,使用. contentinset属性允许你将字段放置在“正确”的位置,并在不偏移UITextViews的情况下调整偏差。
以下是胖子非常有用的答案的更新版本。 它增加了两行重要的行,帮助我在iOS 10和11上(可能在较低的版本上也是如此)让布局正常运行:
@IBDesignable class UITextViewFixed: UITextView {
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
translatesAutoresizingMaskIntoConstraints = true
textContainerInset = UIEdgeInsets.zero
textContainer.lineFragmentPadding = 0
translatesAutoresizingMaskIntoConstraints = false
}
}
重要的几行是两个translatesAutoresizingMaskIntoConstraints = <true/false>语句!
这令人惊讶地删除了我所有环境中的所有边缘!
虽然textView不是第一个响应器,但可能会发生一些奇怪的底边距无法使用接受的答案中提到的sizeThatFits方法解决的情况。
当敲入textView,突然奇怪的底部边缘消失了,一切看起来像它应该,但只要textView有firstResponder。
所以我在Stack Overflow上读到,启用和禁用translatesAutoresizingMaskIntoConstraints在调用之间手动设置帧/边界时确实有帮助。
幸运的是,这不仅适用于框架设置,而且还适用于夹在两个translatesAutoresizingMaskIntoConstraints调用之间的两行setup() !
例如,当在UIView上使用systemlayoutsizefiting计算视图的帧时,这是非常有用的。它会返回正确的大小(以前它没有)!
如原文所述:
不要忘记在检查器中关闭scrollEnabled !这个解决方案在故事板和运行时都能正常工作。
就是这样,现在你真的完成了!