iOS
Swift

iOS10.3で取り消し線が消える症状と回避策

More than 1 year has passed since last update.

iOS10.3でNSAttributedStringによる 取り消し線属性(NSStrikethroughStyleAttributeName)が機能しなくなる症状に出くわしたので、その内容ととその対処法についてまとめます。


  • 取り消し線の適用範囲が全部の文字列であれば再現しない

  • 特定文字列のみ取り消し線を適用すると再現  


    • こういうやつですね。ほげほげ




NSBaselineOffsetAttributeName を追加付与で回避

NSStrikethroughStyleAttributeName , How to strike out the string in iOS 10.3?

↑の記事の最後の方に書いてある方法を自分は参考にしました。

NSBaselineOffsetAttributeNameを追加付与してたところ再現しなくなりました。値は0にしてます。


採用理由

できれば、出くわした箇所がそもそも別々のUILabelにしたほうが良いデザインだったにも関わらず、無理やり1行でこと済ませて箇所だったので分けたかったのですが、リリース直後ということもあり手軽さ重視で↑を選びました。


しかし今度は iOS8 で再現

シミュレータですが調べました。

Sim: シミュレータ

有り: NSBaselineOffsetAttributeName属性の追加付与

無し: NSBaselineOffsetAttributeName属性の付与なし

iOS
Sim/実機
有り
無し

8.1
実機
非表示になる
表示される

8.2
Sim
影響受けず
影響受けず

8.3
Sim
影響受けず
影響受けず

8.4
Sim
影響受けず
影響受けず

9.0
Sim
影響受けず
影響受けず

9.3
Sim
影響受けず
影響受けず

10.0
Sim
影響受けず
影響受けず

10.2
実機
影響受けず
影響受けず

10.3
実機
表示される
非表示になる


最終的にはバージョンで処理分離

OSによって処理分岐はしたくなかったのですが、そもそも上にも書いたとおり別の在るべき形があり、落ち着いたタイミングでUILabelを2つに分けるので許容しました。