mcpField
M
mobile-ios-design

mobile-ios-design

github.com/wshobsonデザイン・UI41.9k23.9k 回インストール2 週間前に更新
リポジトリ

mobile-ios-design について

Apple Human Interface GuidelinesとSwiftUIのパターンに沿った、ネイティブiOSインターフェース設計を開発者向けに案内するスキルです。ナビゲーション、適応レイアウト、システム連携、アクセシビリティを扱います。

主な機能

  1. 01Apple HIGに沿った画面設計
  2. 02SwiftUIのレイアウトとナビゲーション
  3. 03iPhoneとiPad向けのレイアウト調整
  4. 04SF Symbolsとシステムフォントの利用
  5. 05Dynamic Type、ダークモード、アクセシビリティ対応

活用シーン

  1. 01iOSの慣習に沿った画面設計
  2. 02SwiftUI画面とナビゲーションの構築
  3. 03iPhoneとiPad向けの適応レイアウト作成
  4. 04Dynamic TypeとVoiceOverのサポート改善

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wshobson/agents --skill mobile-ios-design

インストール後、Claude Code で/mobile-ios-designを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
hig-patterns.md
ios-navigation.md
swiftui-components.md

詳細

iOS モバイルデザイン

iOS Human Interface Guidelines(HIG)と SwiftUI のパターンを習得し、Apple プラットフォームに自然に馴染む、洗練されたネイティブ iOS アプリケーションを構築します。

このスキルを使用する場面

  • Apple HIG に従った iOS アプリのインターフェース設計
  • SwiftUI のビューとレイアウトの構築
  • iOS のナビゲーションパターン(NavigationStack、TabView、シート)の実装
  • iPhone と iPad 向けの適応型レイアウトの作成
  • SF Symbols とシステムタイポグラフィの使用
  • アクセシブルな iOS インターフェースの構築
  • iOS 固有のジェスチャーとインタラクションの実装
  • Dynamic Type とダークモードを考慮した設計

中核となる概念

1. Human Interface Guidelines の原則

明瞭性: コンテンツは読みやすく、アイコンは正確で、装飾は控えめに 従順性: UI はコンテンツと競合することなく、ユーザーがコンテンツを理解できるように支援する 奥行き: 視覚的なレイヤーとモーションが階層を伝え、ナビゲーションを可能にする

プラットフォームごとの考慮事項:

  • iOS: タッチ操作が基本、コンパクトなディスプレイ、縦向き
  • iPadOS: より広いキャンバス、マルチタスキング、ポインター対応
  • visionOS: 空間コンピューティング、視線/ハンド入力
2. SwiftUI レイアウトシステム

スタックベースのレイアウト:

// Vertical stack with alignment
VStack(alignment: .leading, spacing: 12) {
    Text("Title")
        .font(.headline)
    Text("Subtitle")
        .font(.subheadline)
        .foregroundStyle(.secondary)
}

// Horizontal stack with flexible spacing
HStack {
    Image(systemName: "star.fill")
    Text("Featured")
    Spacer()
    Text("View All")
        .foregroundStyle(.blue)
}

グリッドレイアウト:

// Adaptive grid that fills available width
LazyVGrid(columns: [
    GridItem(.adaptive(minimum: 150, maximum: 200))
], spacing: 16) {
    ForEach(items) { item in
        ItemCard(item: item)
    }
}

// Fixed column grid
LazyVGrid(columns: [
    GridItem(.flexible()),
    GridItem(.flexible()),
    GridItem(.flexible())
], spacing: 12) {
    ForEach(items) { item in
        ItemThumbnail(item: item)
    }
}
3. ナビゲーションパターン

NavigationStack(iOS 16 以降):

struct ContentView: View {
    @State private var path = NavigationPath()

    var body: some View {
        NavigationStack(path: $path) {
            List(items) { item in
                NavigationLink(value: item) {
                    ItemRow(item: item)
                }
            }
            .navigationTitle("Items")
            .navigationDestination(for: Item.self) { item in
                ItemDetailView(item: item)
            }
        }
    }
}

TabView(iOS 18 以降):

struct MainTabView: View {
    @State private var selectedTab = 0

    var body: some View {
        TabView(selection: $selectedTab) {
            Tab("Home", systemImage: "house", value: 0) {
                HomeView()
            }

            Tab("Search", systemImage: "magnifyingglass", value: 1) {
                SearchView()
            }

            Tab("Profile", systemImage: "person", value: 2) {
                ProfileView()
            }
        }
    }
}
4. システム統合

SF Symbols:

// Basic symbol
Image(systemName: "heart.fill")
    .foregroundStyle(.red)

// Symbol with rendering mode
Image(systemName: "cloud.sun.fill")
    .symbolRenderingMode(.multicolor)

// Variable symbol (iOS 16+)
Image(systemName: "speaker.wave.3.fill", variableValue: volume)

// Symbol effect (iOS 17+)
Image(systemName: "bell.fill")
    .symbolEffect(.bounce, value: notificationCount)

Dynamic Type:

// Use semantic fonts
Text("Headline")
    .font(.headline)

Text("Body text that scales with user preferences")
    .font(.body)

// Custom font that respects Dynamic Type
Text("Custom")
    .font(.custom("Avenir", size: 17, relativeTo: .body))
5. ビジュアルデザイン

カラーとマテリアル:

// Semantic colors that adapt to light/dark mode
Text("Primary")
    .foregroundStyle(.primary)
Text("Secondary")
    .foregroundStyle(.secondary)

// System materials for blur effects
Rectangle()
    .fill(.ultraThinMaterial)
    .frame(height: 100)

// Vibrant materials for overlays
Text("Overlay")
    .padding()
    .background(.regularMaterial, in: RoundedRectangle(cornerRadius: 12))

シャドウと奥行き:

// Standard card shadow
RoundedRectangle(cornerRadius: 16)
    .fill(.background)
    .shadow(color: .black.opacity(0.1), radius: 8, y: 4)

// Elevated appearance
.shadow(radius: 2, y: 1)
.shadow(radius: 8, y: 4)

クイックスタートコンポーネント

import SwiftUI

struct FeatureCard: View {
    let title: String
    let description: String
    let systemImage: String

    var body: some View {
        HStack(spacing: 16) {
            Image(systemName: systemImage)
                .font(.title)
                .foregroundStyle(.blue)
                .frame(width: 44, height: 44)
                .background(.blue.opacity(0.1), in: Circle())

            VStack(alignment: .leading, spacing: 4) {
                Text(title)
                    .font(.headline)
                Text(description)
                    .font(.subheadline)
                    .foregroundStyle(.secondary)
                    .lineLimit(2)
            }

            Spacer()

            Image(systemName: "chevron.right")
                .foregroundStyle(.tertiary)
        }
        .padding()
        .background(.background, in: RoundedRectangle(cornerRadius: 12))
        .shadow(color: .black.opacity(0.05), radius: 4, y: 2)
    }
}

ベストプラクティス

  1. セマンティックカラーを使用する: ライトモード/ダークモードの自動サポートのために、常に .primary、.secondary、.background を使用します
  2. SF Symbols を活用する: 一貫性と自動的なアクセシビリティのためにシステムシンボルを使用します
  3. Dynamic Type をサポートする: 固定サイズではなく、セマンティックフォント(.body、.headline)を使用します
  4. アクセシビリティを追加する: .accessibilityLabel() と .accessibilityHint() モディファイアを含めます
  5. セーフエリアを使用する: safeAreaInset を尊重し、画面端での固定パディングを避けます
  6. 状態復元を実装する: ユーザー状態を保持するために @SceneStorage を使用します
  7. iPad のマルチタスキングをサポートする: 分割表示とスライドオーバーに対応する設計にします
  8. 実機でテストする: シミュレーターでは触覚やパフォーマンスの体験を完全には再現できません

よくある問題

  • レイアウトの崩れ: .fixedSize() の使用は控えめにし、柔軟なレイアウトを優先します
  • パフォーマンスの問題: 長いスクロールリストには LazyVStack/LazyHStack を使用します
  • ナビゲーションのバグ: NavigationLink の値が Hashable であることを確認します
  • ダークモードの問題: ハードコードされた色を避け、セマンティックカラーまたはアセットカタログの色を使用します
  • アクセシビリティの不具合: VoiceOver を有効にしてテストします
  • メモリリーク: クロージャ内の強い参照サイクルに注意します

コメント