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 にまとめています。
このフォントがおかしくなる問題は
- UITextViewを使用
- StoryBoard上で日本語文字列を指定する
- コード上からフォント指定をしていない
をすべて満たしている場合に発生しています。
まずは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指定(初期テキスト有り)"
}
}
まとめ
書いてたら混乱してきちゃった。
- Storyboard上でUITextViewのtextに日本語をかかない
- コード上でフォント指定をする
このどちらかができていれば、バグは発生しないはずです。
おわりに
uruly/UITextViewFontIssue に調査したプロジェクトをおいておきました。READMEはこのあと書きます。はい。
エラーログで調べても出てきませんでしたが、「UITextView font」 で調べると以下の記事が出てきたので、結構既知のバグではあると思います。
https://iganin.hatenablog.com/entry/2019/11/10/214038
調査プロジェクト作って記事書き始めてから見つけて、書くのやめようかなとも思いましたがせっかくなので... って書いたけどわかりづらい感じになってしまって申し訳ないです!!!!
ではでは。
コメントはありません。
現在コメントフォームは工事中です。