詳しくは本文で
- UITraitCollection.preferredContentSizeCategory は iOS 10+
- UIContentSizeCategory.isAccessibilityCategory は iOS 11+
- まとめ
UITraitCollection.preferredContentSizeCategory
は iOS 10+
iOS 9 ではフォントサイズから現在どの設定になっているのかを推定します。サイズは以下の記事から
@available(iOS 9.0, *) public var preferredContentSizeCategory: UIContentSizeCategoryCompatible { let contentSizeCategory: UIContentSizeCategory if #available(iOS 10.0, *) { contentSizeCategory = traitCollection.preferredContentSizeCategory } else { contentSizeCategory = UITraitCollectionCompatible.getContentSizeCategory() } return UIContentSizeCategoryCompatible(contentSizeCategory) } private static func getContentSizeCategory() -> UIContentSizeCategory { let fontSize = UIFont.preferredFont(forTextStyle: .body).pointSize switch fontSize { case 14.0: return .extraSmall case 15.0: return .small case 16.0: return .medium case 17.0: return .large case 19.0: return .extraLarge case 21.0: return .extraExtraLarge case 23.0: return .extraExtraExtraLarge case 28.0: return .accessibilityMedium case 33.0: return .accessibilityLarge case 40.0: return .accessibilityExtraLarge case 47.0: return .accessibilityExtraExtraLarge case 53.0: return .accessibilityExtraExtraExtraLarge default: return .medium } }
これでバックポートできますね。
UIContentSizeCategory.isAccessibilityCategory
は iOS 11+
全部の設定値がわかっているので,それを元に,判別するだけですね。
public var isAccessibilityCategory: Bool { if #available(iOS 11.0, *) { return rawValue.isAccessibilityCategory } else { switch rawValue { case .accessibilityMedium: fallthrough case .accessibilityLarge: fallthrough case .accessibilityExtraLarge: fallthrough case .accessibilityExtraExtraLarge: fallthrough case .accessibilityExtraExtraExtraLarge: return true default: return false } } }
まとめ
iOS 9 ではフォントサイズの変化を見なきゃいけないのですが,まだそれまで実装できてません。
ベストなのは traitCollectionDidChange
で変化を受け取れるようにすることだと思うので,それらのコードの錬成に時間がかかるかなーと。
ソースコード全体は Gist に置いておきます。MIT license でお使いください。