モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

<mini> iOS 9 や 10 向けに UITraitCollection の互換機能を生やす

 詳しくは本文で

UITraitCollection.preferredContentSizeCategoryiOS 10+

developer.apple.com

 iOS 9 ではフォントサイズから現在どの設定になっているのかを推定します。サイズは以下の記事から

qiita.com

 @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.isAccessibilityCategoryiOS 11+

developer.apple.com

 全部の設定値がわかっているので,それを元に,判別するだけですね。

 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 でお使いください。

gist.github.com