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つに分けるので許容しました。