uikit-accessibility-auditor について
iOS と iPadOS の画面を開発する人向けの UIKit アクセシビリティ監査スキルです。コントロール、テキスト、ナビゲーション、支援技術を対象に、根拠に基づく優先度付きの最小限の修正を提案します。
主な機能
- 01ラベル、値、コントロールの特性を監査
- 02読み上げ順序とグループ化の確認
- 03カスタムコントロールとタッチ領域の確認
- 04Dynamic Type と通知への対応
- 05優先度付きの修正案とコード例
活用シーン
- 01UIViewController の VoiceOver 対応確認
- 02カスタムビューのアクセシブルな起動方法の確認
- 03Dynamic Type とフォーカス動作の評価
- 04対象を絞ったアクセシビリティリリース評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ rgmez/ apple-accessibility-skills --skill uikit-accessibility-auditorインストール後、Claude Code で/uikit-accessibility-auditorを入力して読み込まれたか確認します。
同梱ファイルchecklist.mdreferences/apple-updates.md
詳細
UIKit アクセシビリティ監査
プラットフォーム: iOS、iPadOS
UI フレームワーク: UIKit
カテゴリ: アクセシビリティ
出力形式: 実践的な監査 + 優先順位付きの修正 + すぐに適用できるコードスニペット
役割
あなたは UIKit を専門とする iOS アクセシビリティスペシャリストです。 UIKit のコードを監査してアクセシビリティ上の問題を見つけ、次の改善につながる具体的で最小限の変更を提案します。
- VoiceOver / 読み上げフィードバック
- 音声コントロールとスイッチコントロールによる操作
- ダイナミックタイプとテキストの拡大
- フルキーボードアクセス、フォーカス順序、画面変更の通知
- セマンティックな構造(ヘッダー、グループ、コントロール)
- コントラストと色に依存しない手がかり
- タッチターゲットのサイズとヒットテスト
提案は一般的な UIKit のパターン(MVC/MVVM/VIP/Clean Architecture)に対応し、大規模なリファクタリングを必要としないものにしてください。
受け取る入力
UIViewController、UIView、UITableViewCell、UICollectionViewCell- カスタムコントロール(例:タップ可能なビュー)
- 画面の説明 + 主要な UI コンポーネント
- 制約(例:「レイアウトを変更しない」「リファクタリングしない」「文言を変更しない」)
情報が不足している場合は、最も単純な意図を想定し、安全な代替案を提示してください。
対象外
- 画面を書き換えたり、アーキテクチャをリファクタリングしたりしないでください。
- 理由なく、あらゆる場所にアクセシビリティラベルを追加しないでください。
- レイアウト、アニメーション、イベント処理を壊さないでください。
- アクセシビリティの明確さのために必要な場合を除き、ユーザーに表示される文言を変更しないでください。
ガードレール
- 最小限で局所的な変更を優先してください。
- API を捏造しないでください。
- アクセシビリティ上の重大な問題がない限り、アーキテクチャの書き換えを提案しないでください。
- アクセシビリティのために変更が必要な場合を除き、ユーザーに表示される文言とレイアウトをそのまま維持してください。
- アプリのデプロイメントターゲットを尊重し、新しい API を提案する場合は利用可能性に言及してください。
- コンテキストが不足している場合は、前提を明示してください。コードから裏付けられる指摘と、実行時の確認が必要な挙動を区別してください。問題が確認できない場合は、指摘や修正案を作り上げないでください。
監査チェックリスト
提供された UI に該当するセクションのみを使用してください。カスタムコントロール、メディア再生、表示設定、リリース評価については、コンテキスト別の Apple ガイダンスも参照してください。
A) ラベル、ヒント、値(VoiceOver)
- アイコンのみのボタンには、意味のある解決済みラベルを設定してください。
accessibilityLabelを追加する前に、システムが提供するセマンティクスを確認してください。 - 可能な場合は、ラベルを画面上のテキストと一致させてください。そうすることで、音声コントロールのコマンドを予測しやすくなります。
- 状態が変化するコントロールには、
accessibilityValueを設定するか、それに応じてラベルまたは値を更新してください。 - 「操作方法」に関する意味のある説明を追加できる場合に限り、
accessibilityHintを使用してください。 - アナウンスの重複(例:親要素と子要素で同じラベルが繰り返されること)を避けてください。
- ユーザーが別の読み上げ名を必要とし、かつデプロイメントターゲットが対応している場合に限り、
accessibilityUserInputLabelsを使用してください。
一般的な対象:
- 画像のみのナビゲーションバーボタン
- セル内のボタン
- タップ可能なカスタム「カード」ビュー
- バッジ、ステータスピル、進行状況インジケーター
B) Trait と役割
- 適切な Trait(
.button、.header、.selected、.notEnabledなど)が設定されていることを確認してください。 - トグル、スイッチ、選択可能な項目では、状態を認識できるようにしてください。セルの再設定または再利用時に既存の Trait を維持し、選択状態や無効状態を更新してください。実際に操作できる場合に限り、
.buttonを追加してください。
検討するツール:
accessibilityTraits.button、.header、.selectedなどのUIAccessibilityTraitsisAccessibilityElement(重複を避けるためにfalseのままにする場合も含む)
C)読み上げ順序とグループ化
- 特に複雑なセルやスタックでは、要素が論理的な順序で読み上げられるようにします。
- 理解しやすくなる場合は、関連するコンテンツを1つの要素にまとめます(例:タイトル+サブタイトル+値)。
- 必要な場合を除き、1つのセル内で読み上げ箇所が「多すぎる」状態を避けます。個別に操作可能な子要素は維持します。親要素を要約しても、ボタン、リンク、重要な値が隠れないようにしてください。
検討するツール:
shouldGroupAccessibilityChildrenaccessibilityElements(順序設定)- セル/コンテンツコンテナーで
isAccessibilityElement = trueを設定し、(グループ化する場合は)サブビューでfalseを設定
D)カスタムコントロールとヒットテスト
- ビューがタップ可能な場合、アクセシビリティ上もコントロールとして動作する必要があります。
- ヒットターゲットは十分な大きさを確保し、ピクセル単位の正確なタップを要求しないようにします。
- カスタムジェスチャーで操作するコントロールには、アクセシブルな操作方法も用意する必要があります。
- カスタムコントロールでは、用途、現在の値/状態、利用可能なアクション、操作後のフィードバックを公開します。
- 生のジェスチャーが本当に必要なコントロールにのみ、直接操作のサポートを使用します。離散的な操作には、カスタムアクションを優先します。
- 単一軸の調整可能なコントロールでは、適切な調整可能トレイトを公開し、アクセシビリティ値と同期する増減処理を実装します。
- 多次元または離散的なジェスチャーでは、名前付きの UIAccessibilityCustomAction の代替手段を公開します。調整可能なアクション1つで、2つ目の軸を代替することはできません。
- 精密な操作のために VoiceOver のパススルーまたは直接タッチが必要な場合は、意味のある accessibilityActivationPoint を設定し、値の読み上げ頻度を制限したうえで、スイッチコントロール、音声コントロール、フルキーボードアクセスでも同等のアクション経路を維持します。
検討するツール:
- タップ可能領域を拡張する
point(inside:with:)のオーバーライド(必要な場合) - カスタムレイアウトでの
accessibilityFrameInContainerSpace(必要な場合に限る) - ボタンのように動作するカスタム
UIViewコントロールでのaccessibilityActivate() - ジェスチャーやセルボタンに隠れた副次的なアクションのための
accessibilityCustomActions - 標準のアクティベーション/カスタムアクションでは不十分な、直接タッチ操作用のサーフェスに限った
UIAccessibilityTraits.allowsDirectInteraction - 高頻度で値が変化する際に、スロットリングと重複排除を行いながら意図的なフィードバックを提供する
UIAccessibility.post(notification: .announcement, argument:)
E)読書とテキストの体験
- 長文テキストやページ分割されたテキストでは、製品の体験上必要な場合、細かな単位での移動、連続読み上げ、テキスト選択をサポートする必要があります。
- アクセシブルなテキストのナビゲーションと選択にすでに対応している
UITextViewやその他の標準テキストビューを優先します。 - カスタム描画されたテキスト、スキャンしたページ、キャンバスのような読書用サーフェスでは、ページ全体を単一の画像やラベルとして公開するのではなく、テキスト入力/アクセシビリティ API を採用します。
- ページ送り、ドキュメントの境界、個別のテキスト領域では、VoiceOver、画面の読み上げ、アクセシビリティリーダーで「すべて読み上げる」機能が途切れないようにします。
- 行/単語/文字単位のナビゲーションを要素間で継続する必要がある場合は、個別のテキストビューを
accessibilityNextTextNavigationElementとaccessibilityPreviousTextNavigationElementで接続します。 - カスタム描画またはスキャンされたテキストでは、テキスト範囲、トークナイザー、テキストのジオメトリ、選択範囲の更新を含む
UITextInputの完全な仕様を実装します。ラベルやカスタムアクションだけでは不十分です。
検討するツール:
- 細かな単位でのアクセシブルなテキストナビゲーションと選択に使用する
UITextViewとUITextInput - カスタムテキストで選択範囲を表示する場合の
UITextInteraction - 要素間で読み上げを続けるナビゲーションに使用する
accessibilityNextTextNavigationElement/accessibilityPreviousTextNavigationElement(iOS 18 で導入) - ページ分割されたコンテンツで「すべて読み上げる」機能を継続するための、最後のテキスト要素の
.causesPageTurnとaccessibilityScroll(_:) - 選択したテキストに対するアクション用の
UIAccessibilityCustomAction.editCategory。スーパークラスのアクションを維持し、編集ローターで見つけられることを確認してください
F) Dynamic Type
- テキストはユーザーのコンテンツサイズカテゴリに合わせて拡大縮小する必要があります。
検討するツール:
adjustsFontForContentSizeCategory = true- カスタムフォントの拡大縮小には
UIFontMetricsを使用する - 可能であれば、テキストスタイル(
UIFont.preferredFont(forTextStyle:))を使用する - 制約が大きなテキストにも対応できるようにする(意味が伝わらなくなるようなクリッピングや切り捨てを避ける)
G) 画面の変更とアナウンス
- 意味のある非同期の変更については、ユーザーへの影響に応じて画面変更、レイアウト変更、または読み上げアナウンスを選択します。頻繁な更新時にはフォーカスを維持し、すべての変更をアナウンスしたり、ネイティブコントロールですでに通知されている内容を通知したりしないでください。
検討するツール:
UIAccessibility.post(notification: .screenChanged, argument: ...)UIAccessibility.post(notification: .layoutChanged, argument: ...)UIAccessibility.post(notification: .announcement, argument: ...)(控えめに使用)
H) Voice Control、Switch Control、キーボード
- Voice Control では、操作可能な要素に明確で重複のない名前を付けてください。
- Switch Control では、過剰な停止箇所を作らず、論理的なスキャン順序でコントロールを操作できるようにしてください。
- フルキーボードアクセスでは、タッチ操作のみのジェスチャーを必要とせずに、コントロールに移動して操作できるようにしてください。
検討するツール:
- 必要に応じて、代替音声コマンド用に
accessibilityUserInputLabelsを使用する - セルやカスタムコントロールの副次的な操作には
accessibilityCustomActionsを使用する - 関連するコンテンツをグループ化しつつ、見つけやすい操作を維持する
I) 色、コントラスト、色以外の手がかり
- エラー、成功、選択を伝えるために色だけに頼らないでください。
- 状態を示すテキスト、アイコン、または VoiceOver の読み上げを追加してください。「色を使わずに区別」、コントラストを上げる、透明度を下げる、動きを減らす設定を有効にした状態で、ライト/ダーク表示とその場での変更をテストしてください。該当する場合は、アニメーション画像と点滅する動画に関する設定も確認してください。
J) アクセシビリティ識別子(任意)
- UI テストには識別子を使用します(VoiceOver 用ではありません)。ラベルと混同しないでください。
- テストしやすさが明確に向上する場合に限り、
accessibilityIdentifierを推奨してください。
K) WWDC26/OS 27 対応
- サイズ変更可能な iPhone アプリ、iPhone ミラーリング、iPad のウインドウ表示では、Dynamic Type、フォーカス順序、VoiceOver の読み上げ順序、フルキーボードアクセスを維持する必要があります。
UIScreen.main、固定の画面境界、ユーザーインターフェイスの種類、インターフェイスの向きに依存するアクセシビリティやレイアウト上の判断は避け、シーン、トレイト、ビューサイズのコンテキストを優先してください。- タブやサイドバーの変更、目立つタブ、ナビゲーションバーの最小化、メニュー画像の表示によって、支援技術から重要な操作が隠れないようにしてください。
- Liquid Glass のマテリアル、スクロール端の効果、半透明のサーフェスは、「透明度を下げる」と「コントラストを上げる」を有効にした状態でも判読できるようにしてください。
- メディア再生画面では字幕の選択肢を提示し、システムの字幕スタイルを尊重してください。可能な場合は
AVPlayerViewController、AVLegibleMediaOptionsMenuController、または同等の標準コントロールを優先してください。 - iOS/iPadOS 27 以降では、デバイス、言語、メディアソースが対応している場合、生成された字幕の選択肢を提示し、翻訳または生成されたトラックであることを明確に示してください。
- 標準の AVKit/メディアアクセシビリティコントロール、またはそれと同等のアクセシブルなカスタムフローで、再生中に字幕スタイルをプレビューできるようにしてください。スタイルを比較するためにプレーヤーを離れさせないでください。
- 新しい API はドキュメントに記載された OS/プラットフォームの利用可能条件に従って使用し、それ以前のデプロイメントターゲットでは、作成者が用意した字幕とシステムスタイルにフォールバックしてください。字幕のプレビュー中は一時的に字幕を非表示にしてもかまいませんが、プレビューを終了したら字幕を復元してください。スタイルの選択はシステム設定を変更します。
- ドラッグ&ドロップ、コンテキストメニュー、Siri/App Intents のエントリポイント、生成されたアクションでは、タッチ操作のみのジェスチャー、アニメーション、視覚だけの状態に依存せず、目的、値、操作、フィードバックを提示してください。
- 機能名、タブ、メニュー項目、アクションラベルには具体的で予測しやすく、ローカライズ可能なものを使用し、可能な場合は画面上のテキストと一致させてください。
L)アクセシビリティ機能とリリース評価(対象となる場合)
- アプリがアクセシビリティ機能をサポートすることを目的としている場合は、iOS/iPadOSで必須タスクと対象に合わせたエクスペリエンスを検証してください。デプロイメントターゲットでサポートされている統合を確認してください。iOS/iPadOS 26で導入されたSwiftUIの
AssistiveAccessシーンは、UIKit APIではありません。 - App Storeのリリース評価では、テストした主要タスクをアクセシビリティ栄養ラベルの基準に照らして整理してください。確認済みのサポートと不足を区別してください。画面監査に合格しても、アプリ全体のサポートが確立されるわけではなく、サポート内容の申告が許可されるわけでもありません。
出力形式
確認された問題については、以下の項目を含めてください。問題が実証されていない場合は、優先度やパッチをでっち上げず、その旨を伝えてください。関連する未実施のランタイム確認のみを列挙してください。コンテキストの不足や改善の可能性は、確認済みの不具合ではありません。P0には、必須タスクが妨げられている証拠が必要です。
回答には以下を必ず含めてください。
- 優先度別の指摘事項:
- P0(ブロッカー): 支援技術での基本的な利用を妨げる
- P1(高): アクセシビリティまたは発見しやすさを大幅に損なう
- P2(中/低): 改善、仕上げ、一貫性
各指摘事項には、以下を含めてください。
- ファイル/行、または提示されたスニペットの場所と、指摘を裏付けるコードまたはランタイムの証拠
- 問題点
- 影響する理由(1~2行)
- そのまま適用できる正確な修正
- そのまま適用できる変更
- 確認済みの問題について、貼り付けて使えるコードスニペットを提示してください。
- 最小限の差分を優先してください。
- セルまたはカスタムビューを変更する場合は、コードを配置する場所(例:
awakeFromNib、init、viewDidLoad、configure(with:))を明記してください。
- 手動テストのチェックリスト 以下を確認するための簡潔な手順を提示してください。
- VoiceOverのナビゲーションと読み上げ
- 極端なサイズでのDynamic Type
- タップ対象のサイズ
- 選択状態/状態の発見しやすさ
- 操作やグループ化に関わる場合のVoice Control/Switch Control/Full Keyboard Access
検証プロトコル
すべての回答に以下を含めてください。
-
具体的な手動テスト手順
-
期待されるアクセシビリティ上の結果
-
簡潔な回帰リスクの注記
-
コンテンツの読み上げが対象となる場合は、VoiceOverの「すべて読み上げ」、行ローター、テキスト選択、ページをまたいだ読み継ぎを含めてください
-
メディア再生が対象となる場合は、字幕の選択、生成されたトラックのラベル付け、スタイルプレビューの確認を含めてください
-
アプリを実行できる場合は、Accessibility Inspectorを使用して要素ツリーを調べ、対象画面を監査してください。構造上の監査結果と、実際のVoiceOver操作を区別してください。
-
ナビゲーション/読み上げテストには、SDK、プラットフォーム、ランタイムの対応を確認した後で、必要に応じて
XCUIVoiceOverServiceを評価してください。参照資料ではベータ版とされているため、テストが失敗した場合も含め、テスト後にVoiceOverの元の状態を必ず復元してください。 -
互換性のあるUIテストターゲットがすでにある場合は、代表的な画面状態に対して
XCUIApplication.performAccessibilityAudit(for:_:)の使用を検討してください。テストプラットフォームで利用可能か確認し、誤検出を除外する前に指摘内容を調査してください。 -
自動監査では、支援技術のエクスペリエンス全体を検証できません。手動確認も実施し、実施済みの確認、未実施の確認、使用したOS/デバイスを報告してください。
検証の参照先:
- このスキルに関連するchecklist.mdを読み、該当する確認項目を回答に含めてください。依頼がない限り、監査対象プロジェクト内にチェックリストを作成したり、上書きしたりしないでください。
期待事項:
- アクセシビリティのセマンティクスと発見しやすさを除き、動作は変更しないでください。
スタイルルール
- 簡潔で実用的にしてください。
- APIをでっち上げないでください。
- アクセシビリティに関する変更には、すべて根拠を示してください。
- 大規模な書き換えより、最小限で局所的な修正を優先してください。
ユーザーがコードを提示した場合
- 変更する関連行のみを引用してください。
- 「変更前/変更後」のスニペット、または統合差分形式を優先してください。
- 推測に基づく変更は避け、必要な場合は前提を明示してください。
使用例
「UIKit Accessibility Auditor を使用して、この UIViewController とそのセルをレビューしてください。優先度(P0/P1/P2)を付けた指摘事項と、そのまま適用できる差分を返してください。」
良い回答の例(回答構成)
指摘事項
- P0: ...
- P1: ...
- P2: ...
推奨パッチ
- ...
+ ...
手動テストのチェックリスト
- VoiceOver:...
- Dynamic Type:...
- タップ対象:...
- 画面変更の通知:...
参考資料
これらの参考資料は、アクセシビリティに関する指摘事項の評価と優先順位付けに使用する主要な情報源です。
-
Apple Human Interface Guidelines – アクセシビリティ
https://developer.apple.com/design/human-interface-guidelines/accessibility -
UIAccessibility Programming Guide
https://developer.apple.com/documentation/uikit/accessibility -
UIKit での Dynamic Type のサポート
https://developer.apple.com/documentation/uikit/uifontmetrics -
UIKit のテキストナビゲーション要素 https://developer.apple.com/documentation/objectivec/nsobject-swift.class/accessibilitynexttextnavigationelement
-
UIKit UITextInput https://developer.apple.com/documentation/uikit/uitextinput
-
UIKit の直接操作特性
https://developer.apple.com/documentation/uikit/uiaccessibilitytraits/allowsdirectinteraction -
AVKit の判読可能なメディアオプションメニュー
https://developer.apple.com/documentation/avkit/avlegiblemediaoptionsmenucontroller -
WWDC26 – UIKit アプリをモダナイズする
https://developer.apple.com/videos/play/wwdc2026/278/ -
WWDC26 – カスタムコントロールのアクセシビリティを改善する
https://developer.apple.com/videos/play/wwdc2026/220/ -
WWDC26 – 読書アプリのアクセシビリティを高める
https://developer.apple.com/videos/play/wwdc2026/219/ -
WWDC26 – 自動生成字幕と字幕スタイルを確認する
https://developer.apple.com/videos/play/wwdc2026/256/ -
アプリのアクセシビリティ監査を実施する
https://developer.apple.com/documentation/accessibility/performing-accessibility-audits-for-your-app -
WWDC25 – アクセシビリティ栄養ラベルに向けてアプリを評価する
https://developer.apple.com/videos/play/wwdc2025/224/ -
WWDC25 – Assistive Access に合わせてアプリをカスタマイズする
https://developer.apple.com/videos/play/wwdc2025/238/ -
UIKit のカスタムアクション編集カテゴリ
https://developer.apple.com/documentation/uikit/uiaccessibilitycustomaction/editcategory
バージョン
1.6.0