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

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

ただいまの
回答率

87.77%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,018

score 423

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

 英語

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

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

 日本語

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

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

 追記

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Xcode7.3.1
Swift2.2
iPhone6s Simulator

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

image
image

回答追記

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

暫定対応

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

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textV1: UITextView!
    @IBOutlet weak var textV2: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let attrText1 = NSMutableAttributedString(string: "test")
        attrText1.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(20), range: NSMakeRange(0, 4))
        attrText1.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(20), range: NSMakeRange(0, 1))
        textV1.attributedText = attrText1



        let attrText2 = NSMutableAttributedString(string: "テスト")
        attrText2.addAttribute(NSFontAttributeName, value: UIFont(name: "AmericanTypewriter", size: 20)!, range: NSMakeRange(0, 3))
        attrText2.addAttribute(NSFontAttributeName, value: UIFont(name: "AmericanTypewriter-Bold", size: 20)!, range: NSMakeRange(0, 1))

        textV2.attributedText = attrText2
    }
}

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

結果
image

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/03 01:16

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

    キャンセル

  • 2016/07/03 08:45

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

    キャンセル

  • 2016/07/04 10:36

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/04 11:15

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

    キャンセル

  • 2016/07/04 11:21

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

    どちらにしても対策しないといけないことに変わりはありませんね。

    キャンセル

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

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る