AgentSkillsCN

hig-design

基于 Apple 人机界面指南(HIG)的 UI 设计与实现支持。在使用 SwiftUI 或 UIKit 构建全新 UI 时可加以应用。“想打造设置界面”“如何实现列表展示?”“该如何规划导航结构?”“哪些组件最为合适?”——每当用户就设计与实现方面提出疑问时,本指南便能及时提供助力。

SKILL.md
--- frontmatter
name: hig-design
description: Apple Human Interface Guidelines (HIG) に基づく UI 設計・実装支援。SwiftUI/UIKit で新規 UI を設計する際に使用。「設定画面を作りたい」「リスト表示はどうすればいい」「ナビゲーション構造を検討したい」「どのコンポーネントが適切か」といった設計・実装の相談時にトリガー。

HIG UI 設計支援

Apple Human Interface Guidelines に基づいて、Apple プラットフォーム向け UI の設計・実装を支援する。

設計ワークフロー

text
1. プラットフォーム特定(iOS/iPadOS/macOS/watchOS/visionOS)
2. ナビゲーション構造決定
3. コンポーネント選択
4. アクセシビリティ考慮
5. SwiftUI コード提案

ナビゲーション構造の決定

text
iOS:
├─ 画面数少ない → NavigationStack
└─ 画面数多い → TabView (最大 5 タブ)

iPadOS:
├─ compact → TabView
└─ regular → NavigationSplitView

macOS:
└─ NavigationSplitView (2-3 列)

watchOS:
├─ リスト → NavigationStack + List
└─ ページ → TabView (PageTabViewStyle)

コンポーネント選択クイックガイド

用途SwiftUI
テキストリストList
画像グリッドLazyVGrid
階層ナビNavigationSplitView
設定画面Form
グラフChart (iOS 16+)
共有ShareLink

必須アクセシビリティ

swift
// 1. システムフォント(Dynamic Type 対応)
Text("見出し").font(.headline)

// 2. セマンティックカラー
Text("ラベル").foregroundStyle(.primary)

// 3. タップターゲット 44pt
Button("") { }.frame(minWidth: 44, minHeight: 44)

// 4. VoiceOver ラベル
Image(systemName: "star").accessibilityLabel("お気に入り")

参照ファイル

詳細が必要な場合に参照:

基本テンプレート

iOS アプリ

swift
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            TabView {
                NavigationStack {
                    ContentView()
                }
                .tabItem { Label("ホーム", systemImage: "house") }

                SettingsView()
                    .tabItem { Label("設定", systemImage: "gear") }
            }
        }
    }
}

iPad/Mac 対応アプリ

swift
@Environment(\.horizontalSizeClass) var sizeClass

var body: some View {
    if sizeClass == .compact {
        TabView { /* iPhone/iPad compact */ }
    } else {
        NavigationSplitView {
            Sidebar()
        } detail: {
            DetailView()
        }
    }
}

設定画面

swift
Form {
    Section("アカウント") {
        TextField("名前", text: $name)
        TextField("メール", text: $email)
            .textContentType(.emailAddress)
    }

    Section("通知") {
        Toggle("プッシュ通知", isOn: $pushEnabled)
    }
}
.navigationTitle("設定")