IOS - 从 UITextView 中删除所有填充

Posted

技术标签:

【中文标题】IOS - 从 UITextView 中删除所有填充【英文标题】:IOS - remove ALL padding from UITextView 【发布时间】:2013-03-27 06:46:02 【问题描述】:

在 SO 上有很多很好的例子来移除 UITextView 的左填充。

How to lose margin/padding in UITextView?

但是,我也需要删除正确的填充。

我试过了……

[tv setContentInset: UIEdgeInsetsMake(-4,-8,-8,-X)];//where X is any integer

几乎所有其他最后两个值的排列都删除了填充,但似乎没有任何效果。也试过了

[tv sizeToFit];
[tv setTextAlignment:[NSTextAlignmentRight]];

Textview 中的以下文本显示“00”

【问题讨论】:

我试过用你说的空字符串替换一个空字符串。但是,如果我现在注释掉插图,我就会再次使用顶部和左侧填充。 不是empty with empty。将" "(空格)替换为""(空)。是否可以将 UITextView 替换为自定义 UILabel? 我将字符串设置为“00”,没有空格。我不确定它是否可能,但我为 navigation.rightbarbuttonitem 创建了一个 UIview,然后使用自定义视图进行了初始化。我在视图中添加了一个图像视图和一个文本视图,我认为我不能子视图标签 UILabel 错误,我的意思是自定义 UITextField。 UITextView 继承自 UIScrollView,在这个短字段中包含很多你不需要的东西。 但是文本字段会出现同样的填充问题吗?我禁用了大多数滚动视图功能,例如可编辑、启用滚动功能以及其他一些功能。 【参考方案1】:

请尝试对 UITextView 进行子类化并覆盖以下方法:

    - (id)styleString

    return [[super styleString] stringByAppendingString:@"; line-height: 1.6em;margin-right: 30px; margin-left: 0px; margin-top: 0px;"];

显然;你可以调整margin-left、margin-top和任何你想要的;)

【讨论】:

ios6的最佳解决方案。但它需要像这样向前声明:@interface UITextView (Stylesheet) -(id)styleString; @end 这个过去的答案仍然非常出色,但现在 Swift 中的上述答案(dbart/mattsven 等)是 Swift 的答案!【参考方案2】:

虽然它只是 iOS 7,但一个非常干净的解决方案是将 textView 的 textContainerInsets 设置为:

[textView setTextContainerInset:UIEdgeInsetsZero];
textView.textContainer.lineFragmentPadding = 0; // to remove left padding

这将有效地删除文本视图内文本周围的所有填充(插入)。如果您的部署目标是 iOS 7+,那么这是迄今为止最好的解决方案。

【讨论】:

完全按照说明工作。 UITextView textContainerInset 是专门为此目的而制作的,因为它不需要子类,所以它是运行 iOS7 及更高版本的系统的最佳答案。 也添加此行以删除左侧填充 self.textView.textContainer.lineFragmentPadding = 0; 为我工作!我在ios7+ 这应该被标记为正确答案。谢谢楼主! Apple Docs 有一个很好的视觉描述【参考方案3】:

我的问题就这样解决了

if([Utils isiOS7orHigher])
    commentView.textContainerInset = UIEdgeInsetsZero;
else 
    commentView.contentInset = UIEdgeInsetsMake(-11,-8,0,0);

更多信息请参见http://foobarpig.com/iphone/get-rid-of-uitextview-padding.html

【讨论】:

一般来说,像在 else 语句中那样硬编码值并不是一个好主意。你永远不知道这会在未来发生怎样的变化,或者在不同的设备上显示等等。 如上所述,这不是一个好的解决方案。像这样“猜测”值从来都不是一件好事 - 你应该通过计算它来找出插图是什么,或者只是用你正在处理的项目的适当特征来消除它。 textView.textContainerInset = UIEdgeInsets.zero 和 textView.textContainer.lineFragmentPadding = 0 在这种情况下就像一个魅力..【参考方案4】:

要完全删除所有填充,必须考虑lineFragmentPadding

let padding = textView.textContainer.lineFragmentPadding
textView.textContainerInset =  UIEdgeInsets(top: 0, left: -padding, bottom: 0, right: -padding)

lineFragmentPadding 默认值为 5,位于片段矩形的开头和结尾。

一些答案​​建议将lineFragmentPadding 设置为0。但是,根据文档中的讨论,它并非旨在表达文本边距。所以不要设置为 0。

【讨论】:

这是最好的解决方案,因为它使用默认的 lineFragmentPadding 值而不是硬编码数字。对于较新的 swift 使用 textContainerInset = UIEdgeInsets(top: 0, left: -padding, bottom: 0, right: -padding)【参考方案5】:

用于 OA 的 Swift 4 版本

self.tDescription.textContainerInset = UIEdgeInsets.zero
self.tDescription.textContainer.lineFragmentPadding = 0

【讨论】:

【参考方案6】:

适用于 iOS 11.7

以下代码对我有用:

    textView.textContainer.lineFragmentPadding = CGFloat(0.0)
    textView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    textView.contentInset = UIEdgeInsets(top: 0,left: 0,bottom: 0,right: 0)

来自官方Documentation:

textContainerInset : 可以设置文本容器和视图大小以及调整大小行为,以便无法准确维护inset,尽管文本系统会尽可能地维护inset

在任何情况下,文本容器的textContainerOrigin 和大小对于文本容器在视图中的位置具有权威性。 文本本身可以在文本容器内有一个额外的插入,由NSTextContainerlineFragmentPadding 方法指定。

【讨论】:

以上是关于IOS - 从 UITextView 中删除所有填充的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS中从UITextview的顶部和底部移除多余的空间?

自 iOS 7 中的删除(退格)操作以来,我如何才能不接收 UITextView 委托消息?

如何在ios中限制UITextView中的内容

从Superview中删除时UITextView不会消失

从 UITextView 的菜单中选择和删除文本时崩溃

iOS 移除 UITextView 内容下方的额外空间