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
和大小对于文本容器在视图中的位置具有权威性。
文本本身可以在文本容器内有一个额外的插入,由NSTextContainer
的lineFragmentPadding
方法指定。
【讨论】:
以上是关于IOS - 从 UITextView 中删除所有填充的主要内容,如果未能解决你的问题,请参考以下文章
如何在iOS中从UITextview的顶部和底部移除多余的空间?