ChatGPT解决这个技术问题 Extra ChatGPT

IOS - 从 UITextView 中删除所有填充

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”

https://i.stack.imgur.com/3kOp8.png

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

d
dbart

虽然它只是 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;
这应该被标记为正确答案。谢谢你,先生!
垂直填充呢?是否必须用一些负的垂直边缘插图来填充它?这件事感觉就像一个笑话(:。苹果,为什么?
Apple Docs 对此有很好的视觉描述
A
App Dev Guy

要完全删除所有填充,必须考虑 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)
A
Abhishek Biswas

用于 OA 的 Swift 4 版本

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

S
Sunil Chauhan

对于 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 方法指定。


M
Mohamed A.Karim

请尝试对 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 的答案!
u
user3106522

我的问题就这样解决了

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 在这种情况下就像一个魅力..