iOS13でUITextViewのフォントが明朝体になってしまうバグに遭遇した話

どうも。Reoです。

久々にiOS開発をしていると、謎のバグにばっかり遭遇してしまってビビりますね。

1年ぶりぐらいに触るプロジェクトなので、アップデートするだけで別のアプリになっていて本当におつらいです。本当に今更のバグ報告かもしれないんですが、残しておきますね。

 

発生した現象

OKAIMOをiOS13でビルドすると、なんかフォントがおかしくなってしまいました。

以前から特に何も触ってないのですが、メモ部分のフォントだけ変わってしまっています。

 

環境

  • macOS Catalina (10.15.5)
  • Xcode 11.5
  • iOS 13.5.1

実機でのみ発生していて、シミュレーターでは問題なく動作します。

 

調査

何が起きているのか…調査してみました。

ビルドしてみると、ログに以下が出ました。

CoreText note: Client requested name “.PingFangSC-Medium”, it will get TimesNewRomanPSMT rather than the intended font. All system UI font access should be through proper APIs such as CTFontCreateUIFontForLanguage() or +[UIFont systemFontOfSize:].

ふむむ?TimesNewRomanPSMT ってやつになってるっぽいです?

 

よくわからんのでちゃんと動いているところと比較してみると、そこだけサンプルの文字列として日本語を書いていました。

一応このアプリ上では、ここの文字列を削除 or 英語にすることでフォントがおかしくなる問題を解決することができました。

 

もっと調査

調査したことは uruly/UITextViewFontIssue にまとめています。

このフォントがおかしくなる問題は

  1. UITextViewを使用
  2. StoryBoard上で日本語文字列を指定する
  3. コード上からフォント指定をしていない

をすべて満たしている場合に発生しています。

 

まずは1番から。

UILabel, UITextView, UITextField, UIButton をStoryboard上で配置しました。

UITextView を用いている場合のみ発生しています。

 

以下は全てUITextViewを用いています。

次に2番。Storyboard上で日本語文字列を入力した場合に発生します。

 

空にした状態でコード上で文字列を指定した場合 → 正しいフォント

英語のみ(日本語文字列なし)の場合 → 正しいフォント

となります。

 

また、Storyboard上で日本語文字列を入力した状態で、コード上から再度textを指定した場合はおかしくなってしまいます。

3番目。コード上からフォント指定をしている場合には、以上のフォント異常の条件を満たしていても正しく表記されました。

 

    @IBOutlet private weak var textView: UITextView! {
        didSet {
            textView.text = "UITextView コードからtext指定(初期テキストなし)"
        }
    }
    @IBOutlet private weak var textView2: UITextView! {
        didSet {
            textView2.text = "UITextView コードからtext指定(初期テキストあり)"
        }
    }
    @IBOutlet weak var textView3: UITextView! {
        didSet {
            textView3.font = UIFont.systemFont(ofSize: 14, weight: .bold)
            textView3.text = "UITextView コードからtext, font指定(初期テキスト有り)"
        }
    }

 

まとめ

書いてたら混乱してきちゃった。

  1. Storyboard上でUITextViewのtextに日本語をかかない
  2. コード上でフォント指定をする

このどちらかができていれば、バグは発生しないはずです。

 

おわりに

uruly/UITextViewFontIssue に調査したプロジェクトをおいておきました。READMEはこのあと書きます。はい。

エラーログで調べても出てきませんでしたが、「UITextView font」 で調べると以下の記事が出てきたので、結構既知のバグではあると思います。

調査プロジェクト作って記事書き始めてから見つけて、書くのやめようかなとも思いましたがせっかくなので… って書いたけどわかりづらい感じになってしまって申し訳ないです!!!!

ではでは。

 

Swift
コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

Related Memo...

UITableView.RowAnimation の .none はアニメーションするよ

UITableView.RowAnimation の .none はアニメーションがnoneなわけじゃなく、デフォルトの設定を使うよという意味らしい。

The inserted or deleted rows use the default animations.

なのでアニメーションしちゃう。今更の気づき。

 

iOS

UINavigationController + UIScrollView の組み合わせで使っている時に謎の余白ができる時

UINavigationController + UIScrollView の組み合わせで使っていて、UIScrollView 上に AutoLayout で上下左右0で View を設置しているのに、30px程度上にずれてしまうとき。

`navigationController.navigationBar.isTranslucent = false` にすると直るかもしれない。

ScrollView上のコンテンツとNavigationBarの重なっているところが透過していたら多分これで直せるはず。

通常のターゲットではちゃんと動いているのに、iOSSnapshotTestCase を用いたテストでだけこの対応が必要なのよくわからないけれど。。。

iOS

記事を書くほどでもないけれどメモっておきたいこと

テスト投稿。

例えばiphone7 の画面サイズ

750 × 1334
半分375 × 667

iOS
more