UITextView内でタブ「\t」が改行される条件と回避法
環境
Xcode: Version 11.3.1
デバイス: Simulator 及び 実機
やりたい事
UITextView内でタブ「\t」を使いつつ、勝手に改行されないようにしたい。
やった事
以下のようなコードを書いて、空白文字がタブの時と半角スペース4つの時とで表示がどう変わるか実行してみました。
swift
1import UIKit 2 3class HogeViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 self.view.backgroundColor = .white 9 10 var hogeTextViewText: String = "" 11 let tab: String = "\t" 12 let fourSpaces: String = " " 13 let newLine: String = "\n" 14 15 hogeTextViewText.append("いろはにほへと") 16 hogeTextViewText.append(tab) 17 hogeTextViewText.append("ちりぬるを") 18 hogeTextViewText.append(tab) 19 hogeTextViewText.append("わかよたれそ") 20 hogeTextViewText.append(tab) 21 hogeTextViewText.append("つれならむ") 22 hogeTextViewText.append(newLine) 23 24 hogeTextViewText.append("うゐのおくやま") 25 hogeTextViewText.append(fourSpaces) 26 hogeTextViewText.append("けふこえて") 27 hogeTextViewText.append(fourSpaces) 28 hogeTextViewText.append("あさきゆめみし") 29 hogeTextViewText.append(fourSpaces) 30 hogeTextViewText.append("ゑひもせす") 31 32 let hogeTextView: UITextView = UITextView(frame: CGRect(x: 100, y: 100, width: self.view.bounds.width - 200, height: self.view.bounds.height - 200)) 33 hogeTextView.text = hogeTextViewText 34 hogeTextView.backgroundColor = .white 35 hogeTextView.textColor = .black 36 hogeTextView.font = UIFont.systemFont(ofSize: 32) 37 hogeTextView.layer.borderWidth = 1.0 38 hogeTextView.layer.borderColor = UIColor.black.cgColor 39 self.view.addSubview(hogeTextView) 40 } 41} 42
その結果は次のような画面です。
タブは行の途中でも改行され、半角スペースは特に改行されはしませんでした。
教えていただきたいこと
- なぜこの様な違いが起こるのか
- タブでも改行を強制的になくすことは可能か
よろしくお願いします。
回答依頼いただきましたが、質問についているタグはいずれも私の範疇ではありません。今後回答依頼だすときは質問タグのスコアの高い方を選んだほうが無駄うちにならずに済むと思います。
コメントありがとうございます。
質問につけたタグ「Swift」に対して、m.ts10806様の回答依頼欄には「Swift: score72」とあったので回答依頼させていただいた次第です。
私に勘違いがあったら申し訳ありません。失礼いたしました。
今後のためにお聞きしたいのですが、私の上記の確認方法では不十分なのでしょうか?
https://teratail.com/tags/Swift
Swiftの1位の方のスコアは11590です。私104位らしいです。
Swift特化の質問に答えた記憶はないですね(そもそも自身のタグとして登録してません。)主にPHPなどWebアプリケーションに関するものを得意としてます。
分かりました。回答依頼欄に書いてあるからと言ってタグを登録してあるわけでもスコアが高いわけでもないという事ですね。
ありがとうございました。
タブというのは別にスペース 4 個分と決まってるわけではなく、むしろ「次のタブ位置」に飛ばすものです。で、どういう表示をお望みでしょうか?
おっしゃる通り、タブは「次のタブ位置」まで進むと理解しております。
質問の画像にも貼りましたように、コード上ではタブしか入れてないのに画面では「ちりぬるを」の後に改行されてしまいます。「わかよたれそ」が入る余地は十分にあると思われるのにです。
例に出した文言が七五調で元々揃ってるので良くなかったですが、文字列を区切り位置を揃えつつ意図せぬ改行の無い様にしたいです。
こんな説明で伝わりますでしょうか?
「次のタブ位置」が何も指定されてないので、デフォルトは次の改行位置になると思われます。
https://stackoverflow.com/questions/15510936/how-do-i-add-tab-stops-to-an-nsattributedstring-and-display-in-a-uitextview
問題は「ちりぬるを」の後に勝手に改行が入ってしまっていることなのですが。。
「いろはにほへと」の前に
for i in 0...25 { hogeTextViewText.append(".\(i < 25 ? tab : newLine)") }
を入れるとデフォルトのタブ位置が分かりますのでご参考まで。また、その行にタブ位置がもうない場合は、次の行の先頭ではなく、次の行の最初のタブ位置まで飛ばされるようです。
ちなみに、デフォルトのタブ位置は文字の大きさとは無関係に設定されているようです。
タブ位置が分かるのは参考になりました。ありがとうございます。
あなたの回答
tips
プレビュー