1. ホーム
  2. ios

[解決済み] UITextViewのマージン/パディングをなくす方法

2022-03-18 14:17:32

質問

私は UITextView は、私の iOS アプリケーションで、大量のテキストを表示します。

のオフセットマージンパラメータを使用して、このテキストをページングしています。 UITextView .

私の問題は、パディングが UITextView は、使用するフォントサイズや書体によって異なるようで、計算が混乱します。

の内容を囲むパディングを削除することは可能ですか? UITextView ?

解決方法は?

2021年版アップ・トゥ・デート

iOSの最も愚かなバグの1つです。

ここで与えられたクラス。 UITextViewFixed は広く使われており、通常は 全体として最も合理的な解決策 .

これがそのクラスです。

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

インスペクタでscrollEnabledをオフにするのを忘れないでください。

  1. このソリューションは、storyboardで正しく動作します。

  2. 実行時に正しく動作する

以上、終了です。

一般的には ほとんどの場合、これだけで十分です。 .

テキストビューの高さを変更する場合でも オンザフライ , UITextViewFixed は、通常、必要なものすべてを備えています。

(高さをその場で変更する一般的な例としては、ユーザーが入力するたびに高さを変更することが挙げられます)。

Appleの壊れたUITextViewはこちら...。

以下は UITextViewFixed :

なお、もちろん、必ず

インスペクタでscrollEnabledをオフにします。

(scrollEnabledをオンにすると、"このビューをできるだけ縦に拡大し、下のマージンをできるだけ拡大することを意味します")


その他の問題

(1) 高さを動的に変更する非常に珍しいケースで、Appleは奇妙なことをします。 下部に余分なスペースを追加する .

いや、本当に!?これはiOSで最も腹立たしいことの1つでしょう。

この問題に遭遇した場合、通常役立つクイックフィックス"をご紹介します。

...
        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年確認。)今後、その行を追加する必要があるかもしれません。

というのは UITextView がiOSで壊れているのは、モバイルコンピューティングの中で最も奇妙なことの一つです。 この質問から10年経ちますが、まだ直っていません!

最後に、似たようなTextのTipsを紹介します。 フィールド : UITextFieldの最大文字数をSwiftで設定します。

完全にランダムなヒント:最後に "..." を追加する方法

UITextView "をUILabel"のように使用していることがよくあります。 そこで、テキストを省略記号("...")を使って切り捨てたい。

その場合、追加します。

 textContainer.lineBreakMode = .byTruncatingTail

もしもの時の便利なヒント ゼロ の高さがあるとき、そこに いいえ テキスト

テキストビューは、テキストだけを表示するために使うことがよくあります。そこで、行数 "0"を使用して、テキストが何行目にあるかによってテキストビューの高さが自動的に変更されることを意味するようにします。

それはいいことですね。でも テキストが全くない場合 の場合、残念ながら同じ高さになります。 1行のテキストがある場合と同じように !!!! テキスト表示が消えることはありません。

もし、これを消したい場合は、次のように追加してください。

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は、このQ&Aページで説明されているような問題には見舞われません。

UITextViewを使う理由は、UILabelの扱いが難しいからです。特に、UITextViewに単に パディング をUILabelに正しく適用することができます。

実際に、UILabelにパディングを正しく追加する方法についての完全なディスカッションはこちらです。 UILabelにスペース/パディングを追加する . ダイナミックハイトセルを使った難しいレイアウトをする場合、UILabelで苦労してやった方が良い場合もあります。