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

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

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

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

Q&A

解決済

2回答

2783閲覧

NSMutableAttributedStringのNSFontAttributeNameの範囲指定が日本語だと効かない?

shoya.shiraki

総合スコア430

Swift

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

0グッド

0クリップ

投稿2016/07/02 08:41

編集2016/07/02 16:18

日本語(を含む)の文字列でNSFontAttributeNameを指定した場合のみ
NSMakeRangeが指定した範囲に効かない現象が起こっています。
回避策をご存知の方いましたら教えていただけると幸いです。

英語

期待する動作:"t"がBoldかつサイズ20になる
結果:"t"がBoldかつサイズ20になる

Swift

1let attrText = NSMutableAttributedString(string: "test") 2attrText.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(20), range: NSMakeRange(0, 1))

日本語

期待する動作:"テ"がBoldかつサイズ20になる
結果:"テスト"がBoldかつサイズ20になる

Swift

1let attrText = NSMutableAttributedString(string: "テスト") 2attrText.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(20), range: NSMakeRange(0, 1))

追記

UITextViewを使用した場合に再現します。
UILabelでは期待する動作が確認できました。

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

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

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

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

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

guest

回答2

0

Kenterouさんの回答への補足みたいな感じになりますが、日本語 & SystemFontでも、最初に文字列全体を非ボールドで設定してやれば正しく表示されないでしょうか?(試した環境では正しく表示されました。iPhone5+iOS8)

swift

1let attrText = NSMutableAttributedString(string: "テスト") 2attrText.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSMakeRange(0, attrText.length)) 3attrText.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(20), range: NSMakeRange(0, 1))

これ不具合なのかな‥。
最初に文字列全体を初期化する癖を付けておいた方が良さそうですね。

投稿2016/07/04 02:09

fuzzball

総合スコア16731

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

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

shoya.shiraki

2016/07/04 02:15

こちらでも正しく表示されるのが確認できました!(Swift:2.2 iOS:9.2) 英語だけの文字列だと、文字列全体に適応させずとも指定できるので 日本語の不具合のような気がします。初期化処理入れるようにします!
fuzzball

2016/07/04 02:21

もし未初期化部分の扱いが「不定」なのであれば仕様ということになりますが‥。どこかで明文化されているかも知れません。(どこか=英語のドキュメント=読めないw) どちらにしても対策しないといけないことに変わりはありませんね。
guest

0

ベストアンサー

Xcode7.3.1
Swift2.2
iPhone6s Simulator

上記の環境で試してみましたが、問題なく表示されました。
再度お試しください。

image
image

回答追記

確かにTextViewだと範囲指定がうまくいかないことを確認しました。
調べてみましたが、自分でも解決方法が分かりませんでした、、、(T_T)

暫定対応

フォントを変更することで範囲指定がうまくいったので、BoldがあるフォントでSystemフォントに近いものを使用して以下の様に対応してみました。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var textV1: UITextView! 6 @IBOutlet weak var textV2: UITextView! 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 let attrText1 = NSMutableAttributedString(string: "test") 12 attrText1.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSMakeRange(0, 4)) 13 attrText1.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(20), range: NSMakeRange(0, 1)) 14 textV1.attributedText = attrText1 15 16 17 18 let attrText2 = NSMutableAttributedString(string: "テスト") 19 attrText2.addAttribute(NSFontAttributeName, value: UIFont(name: "AmericanTypewriter", size: 20)!, range: NSMakeRange(0, 3)) 20 attrText2.addAttribute(NSFontAttributeName, value: UIFont(name: "AmericanTypewriter-Bold", size: 20)!, range: NSMakeRange(0, 1)) 21 22 textV2.attributedText = attrText2 23 } 24}

古い記事ですが、日本語フォントの比較ができたので以下を参考にしました。
iOSで使える font familyの一覧画像

結果
image

暫定的な対応ですが参考にしてください。

投稿2016/07/02 14:33

編集2016/07/02 23:46
_Kentarou

総合スコア8490

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

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

shoya.shiraki

2016/07/02 16:16

すみません情報不足でした。UITextViewの場合のみです。 UILabelでは期待する動作が確認できております。
_Kentarou

2016/07/02 23:45

解決はできませんが、暫定的な対応を追記しました。
shoya.shiraki

2016/07/04 01:36

この方法で対応しようと思います。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問