質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1684閲覧

iOSアプリでタイ語の行間が崩れてしまいます。

ymkwysms

総合スコア8

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2017/06/22 12:52

編集2017/06/27 10:11

###発生している問題
現在タイのテキストをUILabelで表示し、行間をNSAttributedStringで調整しているのですが、
なぜか最後の数行だけが行間が無視されて表示されてしまいます。
最後の数行のみ行間が潰れてしまう

これを正常な行間で全て表示する方法はあるでしょうか?

下記がこちらの実装内容となっております。

swift

1@IBDesignable 2class SpacingLabel: UILabel { 3 4 @IBInspectable var lineHeight: CGFloat = 0 { 5 didSet { 6 updateSpacing() 7 } 8 } 9 @IBInspectable var letterSpacing: CGFloat = 0 { 10 didSet { 11 updateSpacing() 12 } 13 } 14 15 override var text: String? { 16 didSet { 17 updateSpacing() 18 } 19 } 20 21 func updateSpacing() { 22 if let text = self.text, text.characters.count != 0 { 23 let attributedString = NSMutableAttributedString(string: text) 24 let range = NSMakeRange(0, text.characters.count) 25 26 // default attributes 27 attributedString.addAttribute(NSFontAttributeName, value: self.font, range: range) 28 attributedString.addAttribute(NSForegroundColorAttributeName, value: self.textColor, range: range) 29 30 // lineHeight attribute 31 if lineHeight != 0 { 32 let paragraphStyle = NSMutableParagraphStyle() 33 paragraphStyle.minimumLineHeight = lineHeight 34 paragraphStyle.maximumLineHeight = lineHeight 35 paragraphStyle.alignment = self.textAlignment // alignment from UILabel 36 attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: range) 37 } 38 // letter Spacing 39 if letterSpacing != 0 { 40 attributedString.addAttribute(NSKernAttributeName, value: letterSpacing, range: range) 41 } 42 43 // show label 44 self.attributedText = attributedString 45 } else { 46 self.attributedText = nil 47 } 48 } 49}
Bongo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2017/06/22 22:03

タイ語だけおかしくなるんでしょうか?余裕があれば再現するか試してみようと思うのですが、差し支えなければ当該部分のコードをご提示いただけますでしょうか。
guest

回答1

0

下記のコードで試してみましたが、タイ語で行間が無視される現象は起こりませんでした。例文や設定が質問者さんと違っているせいかもしれません。質問者さんの方法と相違のある箇所がありましたらご指摘ください。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 private static let strings = ["Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam turpis mauris, scelerisque eget dapibus a, efficitur semper neque. Morbi ut arcu eget massa egestas pretium. In sit amet tellus gravida mi feugiat hendrerit at nec turpis. Nunc malesuada arcu eu consequat vehicula. Maecenas posuere, odio at sodales pretium, leo velit bibendum enim, ut sollicitudin massa risus in lorem. Vivamus porttitor aliquam bibendum. Curabitur quis lectus libero. Sed vestibulum quis ligula a pharetra. Quisque erat massa, maximus at tincidunt ut, euismod vel urna. Phasellus dignissim commodo sollicitudin. Nulla imperdiet, odio ut venenatis venenatis, nulla quam varius arcu, dapibus congue odio nisl a sem. Donec porta eleifend tincidunt. Sed a bibendum sapien. Aenean non urna nec lacus facilisis mattis sit amet faucibus sapien.\nNullam convallis dolor non porta elementum. Duis ultrices tempus mi, sit amet pharetra odio. Nulla sagittis pretium mi vel tincidunt. Duis et enim et ex placerat lacinia nec eget augue. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas id ornare nisl, vel elementum arcu. Donec nisi mauris, vestibulum vitae libero tristique, fermentum sagittis elit. Etiam a libero interdum, egestas augue quis, lacinia nibh. Proin dictum aliquam orci ac semper. Fusce at consequat leo. Aliquam pulvinar lorem tellus, ut ultricies velit dapibus vel.", "このころこれは、モリーオ市の安楽椅子らで笑いて考えたませ。二六日たちだたがいっしょの上なんか、な立ちあがりてアカシヤのんたたて腕ん悪魔はそんなしばらくらしいたば、なっにファゼーロのかいそうたり周章がかま係愉快たのましまして、わたくしはいちばんいろいろ立派に指しましまし。\nもうそのため、柏町ではガラス服が時計電に革しつづけと探すて、そのデストゥパーゴにいい赤を模型に知らた小さく別当に、ひとりフロックだの公衆園の地面に着です日、みんなどもの声のんに行って来でしものたて、わたくしもどう世話というそこらがくもに来るたこの顔と十十人かもの物に踊って、あの顔で一々思っのをかむらたた。わたくしもあれのなりにかつい先生をびんがそのたい胸のはいって別当の笑い声がすれうた。五月このハムがなりていいデストゥパーゴで答えいうさ、わたくしをく繃帯の剥製にいろいろの幹やとこに出し、音も余計にいらっしゃら、左の馬の友だちが眼というファゼーロの標本がきけれどもしまいのたでし。どういういっしょがあるですテーモ、髪にはそんから白いさが見る青いああ、遠く咽喉が冷しれないモリーオ市、ポランのやっぱしわたしフロックの野原。\nけれどもあんなうちをひとりがけむりまし時間のだいたち、畦やカシオピイア、物知り旅程の顔たり、こどもがあたらしい向うたち、西のテーモ、口笛西のおいでまで、たくさんそんな赤い悪口ませべ石油の役人の中からしろているて、私組打ち風のうつくしい大きく羊地面のように作っれた。たも、誰もさっきのそんな古わざの見て、桜をその樺の木の広場のたくさんで前ばかりをわかるでしう。二、空下はて日曜日の言っの前なない。あなたも山羊にぎやかた別当の山猫の勢の広場に室から見上げたじ。", "เกรดนาฏยศาลาแฟ็กซ์นิรันดร์ซิตี นินจาเฝอ วอลนัทปาสกาลไฟแนนซ์พรีเมียมถูกต้อง พาร์พีเรียดระโงกมอยส์เจอไรเซอร์ เฟรมฮิตมาม่าไฮเปอร์โบรกเกอร์ แบคโฮเอสเพรสโซวาริชศาสตร์มายองเนสแรงผลัก กิฟท์ฮัลโหลเวิร์ลด์แพตเทิร์น โปรดักชั่นแฟกซ์อาร์พีจีเซ่นไหว้ ฮ็อตด็อกวิลล์ เห็นด้วยคอลัมนิสต์รอยัลตี้ โจ๋ ซามูไรออกแบบเอ็กซ์เพรสมวลชน สะบึมสมาพันธ์ชิฟฟอนเทวาธิราชไฟลท์ แคนยอนกิฟท์ เบิร์ด เฟอร์รี่\nไงแอสเตอร์ กู๋เลดี้วิว บอมบ์ปาสเตอร์ สเตริโอสจ๊วตเทวาฮอตกาญจนาภิเษก แอพพริคอทรวมมิตรเครปวิลเลจ วโรกาสไฮบริดอันเดอร์ เพรียวบางฮ็อตด็อกฟลอร์ แบคโฮไลฟ์ เฟรชปักขคณนาดีพาร์ตเมนต์ อิสรชนเวณิกาอิกัวนาพุทธภูมิเกสต์เฮาส์ ผิดพลาด พาวเวอร์ซาตานแฟ็กซ์ แอร์เพนกวินคอลัมนิสต์ โฮป ไนท์กัมมันตะแพ็คทัวร์นาเมนท์ วาริชศาสตร์ฟอร์มแพกเกจ\nคูลเลอร์คอนเซปต์โยเกิร์ตพาร์ทเนอร์ดัมพ์ เวิร์คเยอบีราแผดเผา แฮนด์แบคโฮเซ็นเซอร์ เนิร์สเซอรี ไลน์ผ้าห่ม อีแต๋นฮัมเพนตากอน แพกเกจ โปรคาวบอยซิมบลูเบอร์รี นพมาศรายชื่อ อิเลียดสารขัณฑ์ อุปนายก โบรกเกอร์ไกด์ เอาท์ดอร์ติงต๊อง ซิง กราวนด์ โพลล์บอดี้เก๊ะเดบิตริกเตอร์\nแจ๊กเก็ตอินดอร์แพลนสไปเดอร์ โอเปอเรเตอร์พฤหัสเปเปอร์เห็นด้วย ยาวีมินต์ป๋าไลท์โฟล์ค ตุ๊กตุ๊ก เรตติ้ง รอยัลตี้ไรเฟิลความหมาย มยุราภิรมย์โมเดลฟรังก์คองเกรสแพตเทิร์น สเตอริโอเซอร์น็อค เซอร์ฟลอร์วิภัชภาคซามูไรซิลเวอร์ เบอร์เกอร์ เฟิร์มเอเซียตู้เซฟ คีตราชันแคนยอนโมเดิร์น แทคติคซาตาน ซาร์ดีนบราแอปเปิ้ลการันตีแชมเปี้ยน ฟลุคบ็อกซ์แฟรี่โดนัทมยุราภิรมย์ สุริยยาตร์อิเลียด\nไฟลท์ชัตเตอร์ซิตีวอลนัตไวอากร้า เฟรชชี่ซูเอี๋ยไทม์เบลอ เอ็นเตอร์เทน ฮิตซันตาคลอสไลน์เอ๋ ปิโตรเคมีบัลลาสต์อาร์ติสต์ โซนี่มลภาวะเคลื่อนย้ายอมาตยาธิปไตย อีแต๋นซีนีเพล็กซ์เตี๊ยมจุ๊ยภารตะ ธัมโมเหมยวโรกาส ควีนซาร์วโรกาสบูติคคอนแทค ไลฟ์ อีสเตอร์คาราโอเกะ อาร์พีจีโอเพ่นกรุ๊ปออร์แกน อาร์พีจีเป็นไงโฮมคอนเซปต์มาร์ค นายแบบสโลว์ เฮียแชมเปี้ยนวาทกรรม วอเตอร์รอยัลตี้ป๊อปอีสเตอร์อพาร์ตเมนท์"] 5 6 @IBOutlet weak var label: UILabel! 7 8 @IBAction func changeText(_ sender: UIButton) { 9 let paragraphStyle = NSParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle 10 11 paragraphStyle.lineSpacing = 12.0 12 13 let attributes = [NSParagraphStyleAttributeName: paragraphStyle] 14 let attributedString = NSAttributedString(string: ViewController.strings[sender.tag], attributes: attributes) 15 16 label.attributedText = attributedString 17 } 18 19 override func viewDidLoad() { 20 super.viewDidLoad() 21 } 22 23 override func didReceiveMemoryWarning() { 24 super.didReceiveMemoryWarning() 25 } 26}

投稿2017/06/24 14:45

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ymkwysms

2017/06/27 10:09

ご回答の確認が遅くなりまして申し訳ございません。 ただし、提示いただいた内容とは少々異なる実装内容でして、まだ原因がつかめていない状況です。 こちらの実装内容を質問内容に追記致しましたので、ご確認いただけますでしょうか。 何卒宜しくお願い致します。
Bongo

2017/06/27 13:33

ご提示のコードだと、確かにタイ語の末尾付近に属性が適用されておりませんでした。 おそらく、属性の適用範囲を「NSMakeRange(0, text.characters.count)」としていることがポイントではないかと思います。リファレンスによると「text.characters.count」は書記素クラスターを考慮した、目で見たとおりの文字数を求めてくれるようですが(2つ以上のコードポイントで構成される文字も1文字としてカウント)、一方NSMutableAttributedStringは文字の位置や長さをUTF-16文字の単位で測っているようです。 多分、タイ語の場合はtext.characters.countよりもUTF-16でカウントした文字数の方が長くて(タイ語文章中に複数のUTF-16文字で見た目上の1文字になる文字がいくつかあって)、「NSMakeRange(0, text.characters.count)」では文字列全体をカバーできていないのではないでしょうか。 とりあえず「NSMakeRange(0, text.characters.count)」を「NSMakeRange(0, attributedString.length)」として、文字数としてNSMutableAttributedStringにおける文字数を使うように変更してみてはいかがでしょう(「NSMakeRange(0, text.utf16.count)」でもいいかもしれません)。
fuzzball

2017/06/28 00:16

NSForegroundColorAttributeNameの設定をしているところで色を付けてみると、最後まで適用されていないことが分かり易いですね。こちらでは、attributedString.lengthとtext.utf16.countが同じ値で、正しく動作することを確認出来ました。
ymkwysms

2017/06/28 04:59

なるほど、ご教示いただきありがとうございます。 早速試したのち、結果をご報告させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問