Token导航 LogoToken导航

Agent Skill · 开发规范

ipados-design-guidelines(ipados 设计指南)

用于辅助界面设计、视觉规范、排版、配色、布局和交互体验优化。它适合让 Agent 根据产品场景整理页面结构、生成 UI 方案、检查视觉一致性或改进组件层级。使用时需要结合现有品牌、设计系统和用户任务,不应只堆装饰元素;涉及真实页面改动时,应通过截图或浏览器预览检查文本溢出、对齐和响应式表现。

ipados-design-guidelines 是开发规范类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为只读;许可证信息还不明确,第三方扫描已通过,按安装量在开发规范类的 1,265 个 Skill 里排第 615。

总安装 724周安装 29GitHub Stars 26下载 234核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:ipados-design-guidelines(ipados 设计指南)
来源仓库:https://github.com/dirnbauer/webconsulting-skills
仓库路径:skills/ipados-design-guidelines
安装命令:
npx skills add https://github.com/dirnbauer/webconsulting-skills --skill ipados-design-guidelines
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/dirnbauer/webconsulting-skills --skill ipados-design-guidelines

这个 Skill 是做什么的

开发规范类 Skill 用来统一代码风格、目录结构和评审口径,产出多为检查清单或改写建议。

ipados-design-guidelines 扩展 iOS 设计模式至 iPad 大屏与分屏场景,支持自适应布局。适用于多窗口、拖拽交互、指针事件与键盘快捷键等 iPad 特有功能设计。依据 size class 动态调整 UI 结构,避免硬编码尺寸导致的适配问题。

开发阶段建议使用 Xcode Canvas 模拟不同设备形态下的显示效果。适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

来源仓库内路径:skills/ipados-design-guidelines

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/dirnbauer/webconsulting-skills --skill ipados-…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它标注为只读,先用只读任务试一次,确认行为符合预期再扩大使用范围。

常见问题

6 条

ipados-design-guidelines 怎么安装?

在终端执行 npx skills add https://github.com/dirnbauer/webconsulting-skills --skill ipados-design-gui…。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

ipados-design-guidelines 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

ipados-design-guidelines 需要什么权限?

权限级别是只读。该 Skill 主要提供规则、说明或参考内容,本身偏只读;真正读写文件、联网或执行命令仍取决于宿主 Agent 的任务。

ipados-design-guidelines 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

ipados-design-guidelines 用的人多吗?

公开数据是累计安装 724 次,近一周安装 29 次,下载 234 次,GitHub 26 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

ipados-design-guidelines 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。
  • 标注为只读权限,试用阶段不容易误改本地文件。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发规范类任务、又不想每次都手写提示词的人。
  • 只想先试试效果、不希望它改动本地文件的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

开发规范类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
vercel-react-best-practices

Vercel React 最佳实践 · Codex、Claude

8,490,72025,918操作浏览器MIT通过
web-design-guidelines

网页设计指南 · Codex、Claude

6,686,01625,885需要联网MIT有提醒
remotion-best-practices

Remotion 最佳实践 · Codex、Claude

6,505,6323,027操作浏览器MIT有提醒
supabase-postgres-best-practices

Supabase Postgres 最佳实践 · Codex、Claude

3,175,5232,030需要联网MIT通过
next-best-practices

Next.js 最佳实践 · Codex、Claude

1,848,240841操作浏览器MIT通过
ipados-design-guidelines

ipados 设计指南 · 本页

72426只读未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

iPadOS Design Guidelines

Comprehensive rules for building iPad-native apps following Apple's Human Interface Guidelines. iPad is not a big iPhone -- it demands adaptive layouts, multitasking support, pointer interactions, keyboard shortcuts, and inter-app drag and drop. These rules extend iOS patterns for the larger, more capable canvas.


1. Responsive Layout (CRITICAL)

1.1 Use Adaptive Size Classes

iPad presents two horizontal size classes: regular (full screen, large splits) and compact (Slide Over, narrow splits). Design for both. Never hardcode dimensions.

struct AdaptiveView: View {
    @Environment(\.horizontalSizeClass) var sizeClass

    var body: some View {
        if sizeClass == .regular {
            TwoColumnLayout()
        } else {
            StackedLayout()
        }
    }
}

1.2 Don't Scale Up iPhone UI

iPad layouts must be purpose-built. Stretching an iPhone layout across a 13" display wastes space and feels wrong. Use multi-column layouts, master-detail patterns, and increased information density in regular width.

1.3 Support All iPad Screen Sizes

Design for the full range: iPad Mini (8.3"), iPad (11"), iPad Air (11"/13"), and iPad Pro (11"/13"). Use flexible layouts that redistribute content rather than simply scaling.

1.4 Column-Based Layouts for Regular Width

In regular width, organize content into columns. Two-column is the most common (sidebar + detail). Three-column works for deep hierarchies (sidebar + list + detail). Avoid single-column full-width layouts on large screens.

struct ThreeColumnLayout: View {
    var body: some View {
        NavigationSplitView {
            SidebarView()
        } content: {
            ContentListView()
        } detail: {
            DetailView()
        }
    }
}

1.5 Respect Safe Areas

iPad safe areas differ from iPhone. Older iPads have no home indicator. iPads in landscape have different insets than portrait. Always use safeAreaInset and never hardcode padding for notches or indicators.

1.6 Support Both Orientations

iPad apps must work well in both portrait and landscape. Landscape is the dominant orientation for productivity. Portrait is common for reading. Adapt column counts and layout density to orientation.


2. Multitasking (CRITICAL)

2.1 Support Split View

Your app must function correctly at 1/3, 1/2, and 2/3 screen widths in Split View. At 1/3 width, your app receives compact horizontal size class. Content must remain usable at every split ratio.

2.2 Support Slide Over

Slide Over presents your app as a compact-width overlay on the right edge. It behaves like an iPhone-width app. Ensure all functionality remains accessible in this narrow mode.

2.3 Handle Stage Manager

Stage Manager allows freely resizable windows and multiple windows simultaneously. Your app must:

  • Resize fluidly to arbitrary dimensions
  • Support multiple scenes (windows) showing different content
  • Not assume any fixed size or aspect ratio
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        // Support multiple windows
        WindowGroup("Detail", for: Item.ID.self) { $itemId in
            DetailView(itemId: itemId)
        }
    }
}

2.4 Never Assume Full Screen

The app may launch directly into Split View or Stage Manager. Do not depend on full-screen dimensions during setup, onboarding, or any flow. Test your app at every possible size.

2.5 Handle Size Transitions Gracefully

When the user resizes via multitasking, animate layout changes smoothly. Preserve scroll position, selection state, and user context across size transitions. Never reload content on resize.

2.6 Support Multiple Scenes

Use UIScene / SwiftUI WindowGroup to let users open multiple instances of your app showing different content. Each scene is independent. Support NSUserActivity for state restoration.


3. Navigation (CRITICAL)

3.1 Sidebar for Primary Navigation

In regular width, replace the iPhone tab bar with a sidebar. The sidebar provides more room for navigation items, supports sections, and feels native on iPad.

struct AppNavigation: View {
    @State private var selection: NavigationItem? = .inbox

    var body: some View {
        NavigationSplitView {
            List(selection: $selection) {
                Section("Main") {
                    Label("Inbox", systemImage: "tray")
                        .tag(NavigationItem.inbox)
                    Label("Drafts", systemImage: "doc")
                        .tag(NavigationItem.drafts)
                    Label("Sent", systemImage: "paperplane")
                        .tag(NavigationItem.sent)
                }
                Section("Labels") {
                    // Dynamic sections
                }
            }
            .navigationTitle("Mail")
        } detail: {
            DetailView(for: selection)
        }
    }
}

3.2 Automatic Tab-to-Sidebar Conversion

SwiftUI TabView with .sidebarAdaptable style automatically converts to a sidebar in regular width. Use this for seamless iPhone-to-iPad adaptation.

TabView {
    Tab("Home", systemImage: "house") { HomeView() }
    Tab("Search", systemImage: "magnifyingglass") { SearchView() }
    Tab("Profile", systemImage: "person") { ProfileView() }
}
.tabViewStyle(.sidebarAdaptable)

3.3 Three-Column Layout for Complex Hierarchies

Use NavigationSplitView with three columns when your information architecture has three levels: category > list > detail. Examples: mail (accounts > messages > message), file managers, settings.

3.4 Toolbar at Top

On iPad, toolbars live at the top of the screen in the navigation bar area, not at the bottom like iPhone. Place contextual actions in .toolbar with appropriate placement.

.toolbar {
    ToolbarItemGroup(placement: .primaryAction) {
        Button("Compose", systemImage: "square.and.pencil") { }
    }
    ToolbarItemGroup(placement: .secondaryAction) {
        Button("Archive", systemImage: "archivebox") { }
        Button("Delete", systemImage: "trash") { }
    }
}

3.5 Detail View Should Never Be Empty

When no item is selected in a list/sidebar, show a meaningful empty state in the detail area. Use a placeholder with icon and instruction text, not a blank screen.

3.6 Reduce Recall in Large-Canvas Navigation

Keep sidebar selection, search terms, and disclosure state visible and preserved across size changes and scene switches. In multi-column layouts, users should resume from structure on screen, not from memory.


4. Pointer & Trackpad (HIGH)

4.1 Add Hover Effects to Interactive Elements

All tappable elements should respond to pointer hover. The system provides automatic hover effects for standard controls. For custom views, use .hoverEffect().

Button("Action") { }
    .hoverEffect(.highlight)  // Subtle highlight on hover

// Custom hover effect
MyCustomView()
    .hoverEffect(.lift)  // Lifts and adds shadow

4.2 Pointer Magnetism on Buttons

The pointer should snap to (be attracted toward) button bounds. Standard UIKit/SwiftUI buttons get this automatically. For custom hit targets, ensure the pointer region matches the tappable area using .contentShape().

4.3 Support Right-Click Context Menus

Right-click (secondary click) should present context menus. Use .contextMenu which automatically supports both long-press (touch) and right-click (pointer).

Text(item.title)
    .contextMenu {
        Button("Copy", systemImage: "doc.on.doc") { }
        Button("Share", systemImage: "square.and.arrow.up") { }
        Divider()
        Button("Delete", systemImage: "trash", role: .destructive) { }
    }

4.4 Trackpad Scroll Behaviors

Support two-finger scrolling with momentum. Pinch to zoom where appropriate. Respect scroll direction preferences. For custom scroll views, ensure trackpad gestures feel natural alongside touch gestures.

4.5 Customize Cursor for Content Areas

Change cursor appearance based on context. Text areas show I-beam. Links show pointer hand. Resize handles show resize cursors. Draggable items show grab cursor.

4.6 Pointer-Driven Drag and Drop

Pointer users expect click-and-drag for rearranging, selecting, and moving content. Combine with multi-select via Shift-click and Cmd-click.


5. Keyboard (HIGH)

5.1 Cmd+Key Shortcuts for All Major Actions

Every primary action must have a keyboard shortcut. Standard shortcuts are mandatory:

ShortcutAction
Cmd+NNew item
Cmd+FFind/Search
Cmd+SSave
Cmd+ZUndo
Cmd+Shift+ZRedo
Cmd+C/V/XCopy/Paste/Cut
Cmd+ASelect all
Cmd+PPrint
Cmd+WClose window/tab
Cmd+,Settings/Preferences
DeleteDelete selected item
Button("New Document") { createDocument() }
    .keyboardShortcut("n", modifiers: .command)

5.2 Discoverability via Cmd-Hold Overlay

When the user holds the Cmd key, iPadOS shows a shortcut overlay. Register all shortcuts using .keyboardShortcut() so they appear in this overlay. Group related shortcuts logically.

5.3 Tab Key Navigation Between Fields

Support Tab to move forward and Shift+Tab to move backward between form fields and focusable elements. Use .focusable() and @FocusState to manage keyboard focus order.

struct FormView: View {
    @FocusState private var focusedField: Field?

    var body: some View {
        Form {
            TextField("Name", text: $name)
                .focused($focusedField, equals: .name)
            TextField("Email", text: $email)
                .focused($focusedField, equals: .email)
            TextField("Phone", text: $phone)
                .focused($focusedField, equals: .phone)
        }
    }
}

5.4 Never Override System Shortcuts

Do not claim shortcuts reserved by the system: Cmd+H (Home), Cmd+Tab (App Switcher), Cmd+Space (Spotlight), Globe key combinations. These will not work and create confusion.

5.5 Detect Hardware Keyboard

Adapt UI when a hardware keyboard is connected. Hide the on-screen keyboard shortcut bar. Show keyboard-optimized controls. Use GCKeyboard or track keyboard visibility to detect state.

5.6 Arrow Key Navigation

Support arrow keys for navigating lists, grids, and collections. Combine with Shift for multi-selection. This is essential for productivity-focused apps.

5.7 Shortcuts Must Be Discoverable

Do not rely on users memorizing shortcut vocabularies. Expose commands through the Cmd-hold overlay, menu labels, and visible focus movement so people learn shortcuts by recognition and repetition.


6. Apple Pencil (MEDIUM)

6.1 Support Scribble

iPadOS converts handwriting to text in any standard text field automatically. Do not disable Scribble. For custom text input, adopt UIScribbleInteraction. Test that Scribble works in all text entry points.

6.2 Double-Tap Tool Switching

Apple Pencil 2 and later supports double-tap to switch tools (e.g., pen to eraser). If your app has drawing tools, implement the UIPencilInteraction delegate to handle double-tap.

6.3 Pressure and Tilt for Drawing

For drawing apps, respond to force (pressure) and altitudeAngle/azimuthAngle (tilt) from pencil touch events. Use these for variable line width, opacity, or shading.

6.4 Hover Detection (M2+ Pencil)

Apple Pencil with hover (M2 iPad Pro and later) provides position data before the pencil touches the screen. Use this for preview effects, tool size indicators, and enhanced precision.

// UIKit hover support via UIHoverGestureRecognizer
let hoverRecognizer = UIHoverGestureRecognizer(target: self, action: #selector(pencilHoverChanged(_:)))
hoverRecognizer.allowedTouchTypes = [NSNumber(value: UITouch.TouchType.pencil.rawValue)]
canvas.addGestureRecognizer(hoverRecognizer)

@objc func pencilHoverChanged(_ hover: UIHoverGestureRecognizer) {
    let location = hover.location(in: canvas)
    showBrushPreview(at: location)
}

6.5 PencilKit Integration

For note-taking and annotation, use PKCanvasView from PencilKit. It provides a full drawing experience with tool picker, undo, and ink recognition out of the box.

import PencilKit

struct DrawingView: UIViewRepresentable {
    @Binding var canvasView: PKCanvasView

    func makeUIView(context: Context) -> PKCanvasView {
        canvasView.tool = PKInkingTool(.pen, color: .black, width: 5)
        canvasView.drawingPolicy = .anyInput
        return canvasView
    }
}

7. Drag and Drop (HIGH)

7.1 Inter-App Drag and Drop is Expected

iPad users expect to drag content between apps. Support dragging content out (as a source) and dropping content in (as a destination). This is a core iPad interaction.

// As drag source
Text(item.title)
    .draggable(item.title)

// As drop destination
DropTarget()
    .dropDestination(for: String.self) { items, location in
        handleDrop(items)
        return true
    }

7.2 Multi-Item Drag

Users can pick up one item, then tap additional items to add them to the drag. Support multi-item drag by providing multiple NSItemProvider items. Show a badge count on the drag preview.

7.3 Spring-Loaded Interactions

When dragging over a navigation element (folder, tab, sidebar item), pause briefly to "spring open" that destination. Implement spring-loading on navigation containers to enable deep drop targets.

7.4 Visual Feedback for Drag and Drop

Provide clear visual states:

  • Lift: Item lifts with shadow when drag begins
  • Move: Destination highlights when drag hovers over valid target
  • Drop: Animate insertion at drop point
  • Cancel: Item animates back to origin

7.5 Support Universal Control

Universal Control lets users drag between iPad and Mac. If your app supports drag and drop with standard NSItemProvider and UTTypes, Universal Control works automatically.

7.6 Drop Delegates for Custom Behavior

Use DropDelegate for fine-grained control over drop behavior: validating drop content, reordering within lists, and handling drop position.

struct ReorderDropDelegate: DropDelegate {
    let item: Item
    @Binding var items: [Item]
    @Binding var draggedItem: Item?

    func performDrop(info: DropInfo) -> Bool {
        draggedItem = nil
        return true
    }

    func dropEntered(info: DropInfo) {
        guard let draggedItem,
              let fromIndex = items.firstIndex(of: draggedItem),
              let toIndex = items.firstIndex(of: item) else { return }
        withAnimation {
            items.move(fromOffsets: IndexSet(integer: fromIndex),
                      toOffset: toIndex > fromIndex ? toIndex + 1 : toIndex)
        }
    }
}

8. External Display (MEDIUM)

8.1 Provide Extended Content, Not Just Mirroring

When connected to an external display, show complementary content rather than duplicating the iPad screen. Presentations, reference material, or expanded views belong on the external display while controls stay on iPad.

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        // Additional scene for external display
        WindowGroup(id: "presentation") {
            PresentationView()
        }
    }
}

8.2 Handle Display Connection and Disconnection

Observe external display lifecycle via UIWindowScene events in your SceneDelegate or by listening for UIScene session notifications (UIApplication.didConnectSceneSessionNotification / UIApplication.didDisconnectSceneSessionNotification). Transition gracefully — if the external display disconnects mid-presentation, bring content back to the iPad screen without data loss.

// SceneDelegate: detect when a scene (external display window) connects or disconnects
func scene(_ scene: UIScene,
           willConnectTo session: UISceneSession,
           options connectionOptions: UIScene.ConnectionOptions) {
    guard let windowScene = scene as? UIWindowScene else { return }
    configureExternalDisplay(for: windowScene)
}

func sceneDidDisconnect(_ scene: UIScene) {
    restoreContentToiPad()
}

8.3 Support Full External Display Resolution

Use the full resolution and aspect ratio of the external display. Do not letterbox or pillarbox your content. In iOS 16+ multi-scene contexts, UIScreen.main is deprecated — query the connected display via UIWindowScene.coordinateSpace.bounds and UIWindowScene.screen.scale, or use @Environment(\.displayScale) in SwiftUI.


9. Accessibility (CRITICAL)

Impact: CRITICAL

Rule 9.1: VoiceOver Labels on All Interactive Elements

Every button, control, and interactive element must have a meaningful accessibility label. Icon-only toolbar items and custom views must use .accessibilityLabel().

Correct:

Button(action: compose) {
    Image(systemName: "square.and.pencil")
}
.accessibilityLabel("Compose new message")

Incorrect:

Button(action: compose) {
    Image(systemName: "square.and.pencil")
}
// VoiceOver reads "square.and.pencil" — meaningless to users

Rule 9.2: Support Dynamic Type Including Accessibility Sizes

Use semantic text styles (title, body, caption) so text scales with the user's preferred size. In iPad's larger canvas, never clamp text size or disable scaling. Test up to the five accessibility size steps.

Text("Section Header")
    .font(.headline)  // Scales with Dynamic Type automatically

Rule 9.3: Pointer Accessibility — Hover Must Not Be the Only Cue

Hover states (.hoverEffect) enhance pointer input but must not be the sole indicator of interactivity. Ensure all interactive elements are also distinguishable via color, shape, or label for VoiceOver and keyboard-only users.

Rule 9.4: Full Keyboard Access and Focus Routing

With Full Keyboard Access enabled, Tab must move focus through all interactive elements in logical order. In Split View and multi-window layouts, focus must not escape to a hidden or occluded window. Use @FocusState and .focusable() to control the keyboard focus graph.

struct FormView: View {
    @FocusState private var focusedField: Field?

    var body: some View {
        VStack {
            TextField("Name", text: $name)
                .focused($focusedField, equals: .name)
            TextField("Email", text: $email)
                .focused($focusedField, equals: .email)
        }
    }
}

Rule 9.5: VoiceOver in Split View — Separate Focus Contexts

In Split View, each app has its own VoiceOver focus context. Your app must not assume it occupies the full screen. Ensure VoiceOver can navigate your entire visible interface even at 1/3 or 1/2 split width. Do not hide actionable content outside the visible region without also removing it from the accessibility tree.

Rule 9.6: Respond to Bold Text

When the user enables Bold Text in Settings, custom-rendered text must adapt. SwiftUI text styles handle this automatically. UIKit code must check UIAccessibility.isBoldTextEnabled or use @Environment(\.legibilityWeight) in SwiftUI.

Correct:

// SwiftUI — handled automatically for standard text styles
Text("Section Header")
    .font(.headline)

// SwiftUI — custom rendering respects legibilityWeight
@Environment(\.legibilityWeight) var legibilityWeight

var body: some View {
    Text("Custom Label")
        .fontWeight(legibilityWeight == .bold ? .bold : .regular)
}

Incorrect:

// Hardcoded weight ignores Bold Text preference
label.font = UIFont.systemFont(ofSize: 17, weight: .regular)
// Missing: re-query font when UIAccessibility.boldTextStatusDidChangeNotification fires

Rule 9.7: Respond to Increase Contrast

When the user enables Increase Contrast in Settings, custom colors must provide higher-contrast variants. Use @Environment(\.colorSchemeContrast) in SwiftUI or UIAccessibility.isDarkerSystemColorsEnabled in UIKit.

Correct:

// SwiftUI
@Environment(\.colorSchemeContrast) var contrast

var separatorColor: Color {
    contrast == .increased ? Color.primary : Color.secondary
}

// UIKit
let useHighContrast = UIAccessibility.isDarkerSystemColorsEnabled
let borderColor: UIColor = useHighContrast ? .label : .separator

Incorrect:

// Static color ignores Increase Contrast setting
let borderColor = UIColor.separator // Always low-contrast; ignores user preference

Evaluation Checklist

Use this checklist to verify iPad-readiness:

Layout & Multitasking

  • App uses adaptive layout with horizontalSizeClass
  • Tested at all Split View ratios (1/3, 1/2, 2/3)
  • Tested in Slide Over (compact width)
  • Stage Manager: resizes fluidly to arbitrary dimensions
  • Multiple scenes/windows supported
  • Both orientations (portrait and landscape) work correctly
  • No content clipped at any size
  • Safe areas respected on all iPad models

Navigation

  • Sidebar visible in regular width
  • Tab bar used in compact width
  • Detail view shows placeholder when no selection
  • Toolbar items placed at top, not bottom
  • Three-column layout used where appropriate

Pointer & Trackpad

  • Hover effects on all interactive elements
  • Right-click context menus available
  • Pointer cursor adapts to content (I-beam for text, etc.)
  • Click-and-drag works for reordering

Keyboard

  • Cmd+key shortcuts for all major actions
  • Shortcuts appear in Cmd-hold overlay
  • Tab key navigates between form fields
  • No system shortcut conflicts
  • Arrow keys navigate lists and grids
  • Return/Enter activates default action

Apple Pencil

  • Scribble works in all text fields
  • Drawing apps support pressure and tilt
  • Double-tap interaction handled (if applicable)

Drag and Drop

  • Content can be dragged out to other apps
  • Content can be dropped in from other apps
  • Multi-item drag supported
  • Visual feedback for all drag states

External Display

  • Extended content shown (not just mirror)
  • Graceful handling of connect/disconnect

Accessibility

  • VoiceOver labels on all icon-only buttons and custom interactive elements
  • Text uses semantic type styles and scales with Dynamic Type (including accessibility sizes)
  • All functionality reachable with Full Keyboard Access (Tab navigation, logical focus order)
  • Interactive elements are distinguishable without relying solely on hover state
  • VoiceOver navigates correctly at all Split View widths
  • Bold Text preference respected (SwiftUI handles automatically; UIKit checks UIAccessibility.isBoldTextEnabled)
  • Increase Contrast preference respected (custom colors provide higher-contrast variants via colorSchemeContrast or isDarkerSystemColorsEnabled)

Anti-Patterns

DO NOT: Scale Up iPhone Layouts

Stretching a single-column iPhone UI to fill an iPad screen wastes space, looks lazy, and provides a poor experience. Always redesign for the larger canvas.

DO NOT: Disable Multitasking

Never opt out of multitasking support. Users expect every app to work in Split View and Slide Over. Requiring full screen is hostile to iPad workflows.

DO NOT: Ignore the Keyboard

Many iPad users have Magic Keyboard or Smart Keyboard. An app with no keyboard shortcuts forces them to reach for the screen constantly. Provide shortcuts for all frequent actions.

DO NOT: Use iPhone-Style Bottom Tab Bars in Regular Width

Tab bars at the bottom waste vertical space on iPad and look out of place. Convert to sidebar navigation in regular width. SwiftUI does this automatically with .sidebarAdaptable.

DO NOT: Show Popovers as Full-Screen Sheets

On iPad, popovers should anchor to their source element as floating panels. Only use full-screen sheets for immersive content or flows that genuinely need the full screen. Avoid the iPhone pattern of everything being a sheet.

DO NOT: Ignore Pointer Hover States

Missing hover effects make the app feel broken when using a trackpad. Users cannot tell what is interactive. Always add hover feedback to custom interactive elements.

DO NOT: Hardcode Dimensions

Never hardcode widths, heights, or positions based on a specific iPad model. Use Auto Layout constraints, SwiftUI flexible frames, and GeometryReader for dynamic sizing.

DO NOT: Forget Drag and Drop

On iPad, drag and drop between apps is a core workflow. Not supporting it makes your app a dead end for content. At minimum, support dragging text, images, and URLs in and out.

DO NOT: Override System Keyboard Shortcuts

Claiming Cmd+H, Cmd+Tab, Cmd+Space, or Globe shortcuts will not work and confuses users who expect system behavior. Check Apple's reserved shortcuts list before assigning.

DO NOT: Present Dense Content Without Scrolling

Large iPad screens tempt designers to show everything at once. Content should still scroll when it exceeds the visible area. Never truncate content to avoid scrolling.


Credits & Attribution

This skill is based on the excellent work by ehmo.

Original repository: https://github.com/ehmo/platform-design-skills

Special thanks to ehmo for their generous open-source contributions, which helped shape this skill collection. Adapted by webconsulting.at for this skill collection

平台分布

Codex

37.51%
按下载量换算88

Claude

29.44%
按下载量换算69

Cursor

17.69%
按下载量换算41

Gemini CLI

9.75%
按下载量换算23

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

只读

该 Skill 主要提供规则、说明或参考内容,本身偏只读;真正读写文件、联网或执行命令仍取决于宿主 Agent 的任务。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills