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

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

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

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


当前回答

textView滚动也会影响文本的位置,使它看起来不是垂直居中。我通过禁用滚动并将顶部插入设置为0来设法将文本置于视图的中心:

    textView.scrollEnabled = NO;
    textView.textContainerInset = UIEdgeInsetsMake(0, textView.textContainerInset.left, textView.textContainerInset.bottom, textView.textContainerInset.right);

由于某种原因,我还没有弄清楚,在开始输入之前,光标仍然没有居中,但当我开始输入时,文本立即居中。

其他回答

我肯定会避免任何涉及硬编码值的答案,因为实际边距可能会随着用户字体大小设置等而改变。

下面是user1687195的答案,没有修改textContainer。lineFragmentPadding(因为文档声明这不是预期的用法)。

这适用于iOS 7和更高版本。

self.textView.textContainerInset = UIEdgeInsetsMake(
                                      0,
                                      -self.textView.textContainer.lineFragmentPadding,
                                      0,
                                      -self.textView.textContainer.lineFragmentPadding);

这实际上是相同的结果,只是稍微干净一点,因为它没有滥用lineFragmentPadding属性。

对于iOS 7.0,我发现contentInset技巧不再有效。这是我在iOS 7中用来去除边距/填充的代码。

这将把文本的左边缘带到容器的左边缘:

textView.textContainer.lineFragmentPadding = 0

这将导致文本的顶部与容器的顶部对齐:

textView.textContainerInset = .zero

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

对我来说(iOS 11和Xcode 9.4.1),神奇的工作是设置textView。字体属性为UIFont.preferred(forTextStyle:UIFontTextStyle)风格,也是Fattie提到的第一个答案。但胖子的答案没有工作,直到我设置textView。字体属性。否则UITextView行为不稳定。

[firstNameTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];

这个解决方案是在2009年iOS 3.0发布时编写的。它不再适用。

我遇到了完全相同的问题,最后我不得不吸毒

nameField.contentInset = UIEdgeInsetsMake(-4, -8, 0, 0);

其中nameField是一个UITextView。我使用的字体是Helvetica 16号。这只是我所绘制的特定字段大小的自定义解决方案。这使得左偏移量与左侧齐平,以及我想要它被绘制的盒子的顶部偏移量。

此外,这似乎只适用于你使用默认对齐的UITextViews,即,

nameField.textAlignment = NSTextAlignmentLeft;

例如,向右对齐,UIEdgeInsetsMake似乎对右边缘没有任何影响。

至少,使用. contentinset属性允许你将字段放置在“正确”的位置,并在不偏移UITextViews的情况下调整偏差。