小编典典

如何在 UITextView 中丢失边距/填充

all

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

然后,我使用UITextView.

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

是否可以删除围绕内容的填充UITextView


阅读 108

收藏
2022-03-10

共1个答案

小编典典

2021 年最新版本

它是 iOS 中最愚蠢的错误之一。

这里给出的类UITextViewFixed, 被广泛使用,通常是总体上最合理的解决方案

这是课程:

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
    }
}

不要忘记在 Inspector 中关闭 scrollEnabled!

  1. 该解决方案在情节提要中正常工作
  2. 该解决方案在运行时正常工作

就是这样,你完成了。

一般来说,在大多数情况下,这应该就是您所需要的

即使您正在动态更改文本视图的高度通常UITextViewFixed也可以满足您的所有需求。

(动态更改高度的一个常见示例是在用户键入时更改它。)

这是 Apple 损坏的 UITextView ......

带有 UITextView 的界面生成器的屏幕截图

这里是UITextViewFixed

带有 UITextViewFixed 的界面生成器的屏幕截图

请注意,您当然必须…

…在 Inspector 中关闭 scrollEnabled!

(开启 scrollEnabled 的意思是“通过尽可能扩大底部边距,让这个视图尽可能垂直扩大。”)


一些进一步的问题

(1) 在一些非常不寻常的情况下动态改变高度,苹果做了一件奇怪的事情:他们在底部增加了额外的空间

不完全是!这一定是 iOS 中最令人愤怒的事情之一。

如果您遇到问题,这里有一个“快速修复”,通常会有所帮助:

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

        // this is not ideal, but sometimes this "quick fix"
        // will solve the "extra space at the bottom" insanity:
        var b = bounds
        let h = sizeThatFits(CGSize(
           width: bounds.size.width,
           height: CGFloat.greatestFiniteMagnitude)
       ).height
       b.size.height = h
       bounds = b
 ...

(2) 在极少数情况下,要修复 Apple 的另一个微妙问题,您必须添加:

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
    super.setContentOffset(contentOffset, animated: false) // sic
}

(3) 可以说,我们应该添加:

contentInset = UIEdgeInsets.zero

.lineFragmentPadding = 0UITextViewFixed.

但是......信不信由你......这在当前的iOS中不起作用!(检查 2021。)将来可能需要添加该行。

在 iOS 中被破坏的事实UITextView是所有移动计算中最奇怪的事情之一。这个问题十周年了,它仍然没有解决!

最后,这里有一个类似 Text Field的提示:Set the maximum character length of a UITextField in Swift

完全随机提示:如何在末尾添加“…”

您经常使用“像 UILabel”一样的 UITextView。因此,您希望它使用省略号“…”截断文本

如果是这样,请添加:

 textContainer.lineBreakMode = .byTruncatingTail

如果您想要高度,则方便提示,什么时候根本没有文字

通常,您使用文本视图仅显示文本。因此,您使用行“0”表示文本视图将根据文本行数自动更改高度。

那太棒了。但是如果根本没有文字,那么不幸的是,你得到的高度就像有一行文字一样!!!!文本视图永远不会“消失”。

在此处输入图像描述

如果你想让它“消失”,只需添加这个

override var intrinsicContentSize: CGSize {
    var i = super.intrinsicContentSize
    print("for \(text) size will be \(i)")
    if text == "" { i.height = 1.0 }
    print("   but we changed it to \(i)")
    return i
}

在此处输入图像描述

(我把它设为“1”高度,所以很清楚那个演示中发生了什么,“0”很好。)

UILabel 呢?

当只是显示文本时,UILabel 比 UITextView 有很多优势。UILabel 不会遇到此问答页面中描述的问题。

事实上,我们通常“放弃”而只使用 UITextView 的原因是 UILabel 很难使用。特别是要正确地向 UILabel添加padding是非常困难的。

事实上,这里是关于如何“最终”正确地向 UILabel 添加填充的完整讨论:向 UILabel添加空间/填充。在某些情况下,如果您正在使用动态高度单元格进行困难的布局,有时最好使用 UILabel 进行困难的布局。

2022-03-10