mobile-ios-design について
Apple Human Interface GuidelinesとSwiftUIのパターンに沿った、ネイティブiOSインターフェース設計を開発者向けに案内するスキルです。ナビゲーション、適応レイアウト、システム連携、アクセシビリティを扱います。
主な機能
- 01Apple HIGに沿った画面設計
- 02SwiftUIのレイアウトとナビゲーション
- 03iPhoneとiPad向けのレイアウト調整
- 04SF Symbolsとシステムフォントの利用
- 05Dynamic Type、ダークモード、アクセシビリティ対応
活用シーン
- 01iOSの慣習に沿った画面設計
- 02SwiftUI画面とナビゲーションの構築
- 03iPhoneとiPad向けの適応レイアウト作成
- 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.mdios-navigation.mdswiftui-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)
}
}
ベストプラクティス
- セマンティックカラーを使用する: ライトモード/ダークモードの自動サポートのために、常に
.primary、.secondary、.backgroundを使用します - SF Symbols を活用する: 一貫性と自動的なアクセシビリティのためにシステムシンボルを使用します
- Dynamic Type をサポートする: 固定サイズではなく、セマンティックフォント(
.body、.headline)を使用します - アクセシビリティを追加する:
.accessibilityLabel()と.accessibilityHint()モディファイアを含めます - セーフエリアを使用する:
safeAreaInsetを尊重し、画面端での固定パディングを避けます - 状態復元を実装する: ユーザー状態を保持するために
@SceneStorageを使用します - iPad のマルチタスキングをサポートする: 分割表示とスライドオーバーに対応する設計にします
- 実機でテストする: シミュレーターでは触覚やパフォーマンスの体験を完全には再現できません
よくある問題
- レイアウトの崩れ:
.fixedSize()の使用は控えめにし、柔軟なレイアウトを優先します - パフォーマンスの問題: 長いスクロールリストには
LazyVStack/LazyHStackを使用します - ナビゲーションのバグ:
NavigationLinkの値がHashableであることを確認します - ダークモードの問題: ハードコードされた色を避け、セマンティックカラーまたはアセットカタログの色を使用します
- アクセシビリティの不具合: VoiceOver を有効にしてテストします
- メモリリーク: クロージャ内の強い参照サイクルに注意します
コメント
Markdown 対応