我在我的iOS应用程序中有一个UITextView,它显示大量的文本。

然后,我通过使用UITextView的offset margin参数来分页此文本。

我的问题是UITextView的填充使我的计算感到困惑,因为它似乎是不同的,取决于我使用的字体大小和字体。

是否有可能移除UITextView内容周围的填充?


当前回答

这是一个简单的小扩展,将删除苹果的默认边际从每个文本视图在你的应用程序。

注意:界面构建器仍将显示旧的边缘,但你的应用程序将按预期工作。

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

这两行都需要完全删除空白/填充。

使用用户定义运行时属性的故事板或接口构建器解决方案:

iOS 7.1和iOS 6.1的截图内容为contentInset ={{-10, -5},{0,0}}。

对于 SwiftUI

如果你正在使用UIViewRepresentable制作自己的TextView并想要控制填充,在你的makeUIView函数中,简单地做:

uiTextView。textContainerInset = UIEdgeInsets(上:10,左:18,下:0,右:18)

或者随便你。

在iOS 5上UIEdgeInsetsMake(-8,-8,-8,-8);看起来效果不错。

如果有人正在寻找最新的Swift版本,那么下面的代码可以很好地与Xcode 10.2和Swift 4.2一起工作

yourTextView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)