tvos-design-guidelines by ehmo/platform-design-skills
npx skills add https://github.com/ehmo/platform-design-skills --skill tvos-design-guidelinesApple TV 是一款完全基于焦点导航和 Siri Remote 驱动的客厅设备。没有指针,没有触摸屏,也没有鼠标。每一个设计决策都必须考虑到 10 英尺的观看距离、遥控器的简洁性以及电视消费的“后仰式”特性。
焦点系统是所有 tvOS 交互的基础。没有光标——用户使用 Siri Remote 的触摸表面在元素之间移动焦点。
FOCUS-01:每个交互元素都必须具有清晰可见的焦点状态。 被聚焦的项目必须与未聚焦的项目有明确的区分。使用缩放(通常为 1.05x-1.1x)、通过阴影提升高度、亮度变化或边框高亮。切勿仅依赖颜色。
FOCUS-02:焦点移动必须是可预测的,并遵循逻辑空间布局。 当用户向右滑动时,焦点必须移动到视觉上位于右侧的元素。避免焦点在屏幕上意外跳跃的布局。网格和线性布局最安全。
FOCUS-03:使用焦点引导(UIFocusGuide)来连接布局中的间隙。 当可聚焦元素之间存在视觉间隙时,添加不可见的焦点引导,这样用户就不会卡住。每次滑动都应该将焦点移动到有意义的地方。
FOCUS-04:对聚焦的项目应用视差效果。 聚焦的卡片、海报和图标应表现出轻微的视差倾斜,以响应触摸表面的移动。使用具有前景、中景和背景层的分层图像(LSR 格式)。这传达了深度并确认了焦点。
正确示例:
// SwiftUI — 具有显式焦点状态的自定义焦点引擎
struct ContentView: View {
@FocusState private var focusedItem: String?
var body: some View {
HStack(spacing: 40) {
ForEach(items) { item in
CardView(item: item)
.focusable()
.focused($focusedItem, equals: item.id)
.scaleEffect(focusedItem == item.id ? 1.1 : 1.0)
.shadow(radius: focusedItem == item.id ? 20 : 0)
.animation(.easeInOut(duration: 0.15), value: focusedItem)
}
}
}
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
错误示例:
// SwiftUI — 没有焦点状态:未聚焦和聚焦的项目看起来相同
struct ContentView: View {
var body: some View {
HStack(spacing: 40) {
ForEach(items) { item in
CardView(item: item)
.focusable()
// 聚焦时没有缩放、阴影或视觉变化
// 用户无法分辨哪个项目被选中
}
}
}
}
FOCUS-05:使焦点目标足够大,以便于导航。 卡片的最小推荐触摸目标是 250x150pt。较小的元素很难通过基于滑动的导航来定位。尽可能将小操作分组到聚焦的父项下。
FOCUS-06:在每个屏幕上提供一个默认的聚焦元素。 当视图出现时,必须有一个元素已经持有焦点。选择最可能的用户意图——通常是主要内容项或集合中的第一个项目。
FOCUS-07:返回屏幕时保留焦点记忆。 如果用户导航离开并返回,焦点应恢复到该屏幕上最后聚焦的项目,而不是重置为默认值。
FOCUS-08:切勿困住焦点。 用户必须始终能够将焦点从任何元素上移开。如果焦点无法离开某个区域,应用就会显得有问题。
FOCUS-09:降低重新定位的成本。 保持行顺序稳定,返回时恢复先前的焦点,并优先选择附近的焦点目的地,这样用户在每次导航步骤后就不必重新扫描整个屏幕。
| 图层 | 用途 | 移动量 |
|---|---|---|
| 背景 | 静态背景,模糊图像 | 最小(1-2pt) |
| 中景 | 主要艺术作品或内容图像 | 中等(3-5pt) |
| 前景 | 标题文本、徽标、徽章 | 最大(5-8pt) |
在资源目录中使用 Xcode 的 LSR(分层静态图像)格式来处理静态分层图像——系统会在聚焦时自动为它们添加动画。对于自定义的程序化视差,堆叠 UIImageView 实例,并使用焦点引擎回调(didUpdateFocus(in:with:) 和 UIFocusAnimationCoordinator)来驱动焦点转换期间的图层移动。(UIMotionEffect 仅响应 Siri Remote 陀螺仪的细微微动,并非焦点驱动视差的机制。)
Siri Remote 是主要(通常是唯一)的输入设备。它有一个触摸表面、菜单按钮、播放/暂停按钮、Siri/麦克风按钮、音量按钮和一个电源按钮。
REMOTE-01:触摸表面滑动控制焦点移动。 滑动使焦点向相应方向移动。点击触摸表面选择聚焦的项目。这是两个基本的交互——围绕它们设计一切。
REMOTE-02:菜单按钮必须始终用于返回导航。 按下菜单按钮应关闭当前屏幕、关闭覆盖层或在层次结构中向上导航。在顶层,它返回 Apple TV 主屏幕。切勿违背这一预期。
REMOTE-03:播放/暂停按钮必须控制媒体播放。 如果媒体正在播放,无论当前显示什么屏幕,播放/暂停都应切换播放状态。不要将此按钮重新用于非媒体操作。
REMOTE-04:切勿要求复杂或多指手势。 Siri Remote 的触摸表面很小。不要要求捏合、旋转、多点按或长按手势。坚持使用单指滑动和点击。
REMOTE-05:滑动方向必须直观且一致。 水平滑动水平滚动;垂直滑动垂直滚动。切勿反转轴。对角线内容移动应遵循主要的滑动轴。
REMOTE-06:支持 Siri 语音输入进行搜索和文本输入。 在 tvOS 上通过屏幕键盘输入文本很繁琐。始终支持听写和 Siri 搜索作为键盘输入的替代方案。
REMOTE-07:提供点击反馈。 当用户点击触摸表面选择项目时,提供即时的视觉反馈(动画、高亮变化或触觉式视觉脉冲),使点击感觉有响应。
REMOTE-08:切勿让屏幕键盘成为唯一实用的文本输入途径。 对于搜索、登录和设置,优先选择听写、最近查询、自动填充或基于短代码的流程,而不是用遥控器输入长文本。遥控器文本输入需要很高的操作和认知成本。
Apple TV 内容是从房间的另一端观看的,通常距离屏幕 8-12 英尺(2.5-3.5 米)。所有视觉设计都必须考虑到这个距离。
DISTANCE-01:正文字体最小尺寸为 29pt。 小于 29pt 的文本在客厅距离下难以阅读。标题应为 48pt 或更大。使用 San Francisco Display 或类似的高可读性字体。
DISTANCE-02:保持文本和背景之间的高对比度。 默认使用深色背景上的浅色文本。tvOS 使用深色主题。对比度应达到 WCAG AA 或更高标准(正文文本 4.5:1,大文本 3:1)。
DISTANCE-03:限制每屏文本量。 电视是一种视觉媒介。显示标题、简短描述和元数据——而不是段落。如果需要扩展文本,请使用用户明确打开的、可滚动的文本覆盖层。
DISTANCE-04:使用高分辨率、醒目清晰的图像。 全屏背景图像应为 1920x1080 或 3840x2160(4K)。内容艺术作品应清晰且视觉上吸引人。避免使用在远处会失去清晰度的小而详细的插图。
DISTANCE-05:保持布局简单且宽敞。 充足的边距和内边距。不要用许多小元素挤满屏幕。单行 5-7 张卡片优于密集的 20+ 缩略图网格。
DISTANCE-06:使用电视安全区域。 将所有关键内容保持在安全区域内(距边缘 60pt 内嵌)。由于过扫描,靠近屏幕边缘的内容在某些电视机上可能会被裁剪。
DISTANCE-07:避免使用细字体和细线边框。 细线条在电视显示器上会消失,尤其是在运动模糊和压缩伪影的情况下。至少使用中等或半粗体字重。
| 元素 | 最小尺寸 | 推荐尺寸 |
|---|---|---|
| 正文文本 | 29pt | 31-35pt |
| 次要标签 | 25pt | 29pt |
| 标题 | 48pt | 52-76pt |
| 大标题 | 64pt | 76-96pt |
| 按钮 | 29pt | 35-38pt |
顶部栏是一个突出的内容区域,当用户在 Apple TV 主屏幕上聚焦于您的应用图标时显示。它是展示内容的黄金位置。
SHELF-01:提供顶部栏扩展。 应用应包含一个返回动态内容的 TVTopShelfContentProvider(tvOS 14+)。TVTopShelfProvider 自 tvOS 14 起已弃用——不要使用它。静态的顶部栏是错失参与机会的表现。
SHELF-02:为内容使用正确的布局样式。
SHELF-03:顶部栏项目必须能深层链接到应用中。 每个项目在被选中时必须打开相应的内容。切勿将所有项目链接到同一个通用着陆页。
SHELF-04:使用高质量、吸引人的图像。 顶部栏图像在主屏幕上以大尺寸显示。模糊、低分辨率或文字过多的图像看起来不专业。推荐的图像尺寸:
SHELF-05:保持顶部栏内容新鲜。 定期更新顶部栏内容——理想情况下反映最近添加的、流行的或个性化的内容。过时的顶部栏内容表明应用已被放弃。
Apple TV 主要是一个媒体消费设备。播放界面必须遵循既定的电视惯例。
MEDIA-01:使用标准的传输控件。 提供播放、暂停、快进(10 秒)、快退(10 秒)和一个擦洗器时间线。使用 AVPlayerViewController 可以免费获得这些功能,并具有一致的行为。
MEDIA-02:在播放期间向下滑动时显示信息覆盖层。 播放期间向下滑动应显示一个信息面板,展示标题、描述和元数据。再次向下滑动或按菜单键可将其关闭。
MEDIA-03:支持通过触摸表面进行擦洗。 播放期间在触摸表面上向左/右滑动应能擦洗时间线。尽可能在擦洗时显示缩略图预览。
MEDIA-04:支持字幕和替代音轨。 通过信息覆盖层或标准播放器控件提供字幕选择和音轨切换的访问。
MEDIA-05:在适当的情况下支持画中画。 对于视频内容,允许画中画,以便用户可以在观看时浏览其他内容。实现 AVPictureInPictureController 集成。
MEDIA-06:记住播放位置。 当用户返回之前观看过的内容时,从他们离开的地方继续播放。在内容缩略图上显示进度指示器。
MEDIA-07:优雅地处理中断。 如果用户在播放期间按下 TV 按钮或切换应用,请保存位置并干净地暂停。当用户返回时,无需重新缓冲即可恢复。
tvOS 的标签栏位于屏幕顶部,与 iOS 位于底部不同。它提供应用各主要部分之间的导航。
TAB-01:将标签栏放在屏幕顶部。 这是标准的 tvOS 惯例。底部标签栏是 iOS 的模式,在电视上感觉不对。
TAB-02:标签栏应该是半透明的并覆盖在内容之上。 标签栏浮动在内容之上,带有模糊效果。当用户聚焦于标签栏时,内容会向下移动以腾出空间。
TAB-03:使用 3-7 个标签。 少于 3 个标签表明应用对于标签导航来说太简单。超过 7 个标签则难以通过水平滑动进行导航。
TAB-04:每个标签都必须有文本标签。 仅图标的标签在电视观看距离下是不够的。为了清晰起见,需要文本标签。图标可以伴随文本,但不是必需的。
TAB-05:标签栏上的焦点应该感觉轻量。 当焦点移动到标签栏时,它应该平滑地出现。内容预览应该在半透明的栏下方可见。切换标签应立即更新下方的内容或显示加载状态。
TAB-06:记住应用启动之间的选定标签。 如果用户离开应用时在“搜索”标签页,那么当他们重新打开应用时,应返回到“搜索”标签页。
Apple TV 支持 VoiceOver。视力正常的用户使用焦点导航;VoiceOver 用户还能听到语音描述。两者都必须正常工作。
ACCESS-01:每个交互元素都必须有有意义的无障碍标签。 仅图标的按钮和图像卡片必须有标签。当焦点到达时,VoiceOver 会播报聚焦项目的名称。
ACCESS-02:为非显而易见的交互提供无障碍提示。 如果点击卡片执行的操作不是打开内容(例如,启动预告片而不是完整播放),请使用无障碍提示来描述这一点。
ACCESS-03:确保 VoiceOver 焦点顺序与视觉焦点顺序匹配。 VoiceOver 必须按照焦点引擎导航产生的相同顺序遍历元素。通过 UIFocusGuide 进行的自定义焦点排序不得在 VoiceOver 阅读顺序中造成不连续。
ACCESS-04:尊重“减少动态效果”。 当用户在无障碍功能设置中启用“减少动态效果”时,必须减少或禁用视差效果和其他动画。
ACCESS-05:响应“粗体文本”。 当用户启用“粗体文本”时,自定义渲染的文本必须适应。SwiftUI 的动态类型样式会自动处理此问题;自定义文本渲染必须检查 UIAccessibility.isBoldTextEnabled 或使用 @Environment(\.legibilityWeight)。
ACCESS-06:响应“增强对比度”。 当用户启用“增强对比度”(更深的系统颜色)时,自定义颜色必须提供更高对比度的变体。在 SwiftUI 中使用 @Environment(\.colorSchemeContrast) 或在 UIKit 中使用 UIAccessibility.isDarkerSystemColorsEnabled 来检测并应用适当的值。
ACCESS-07:尊重动态类型 / 更大文本。 tvOS 通过 UIContentSizeCategory 支持“更大文本”无障碍功能设置。使用 SwiftUI 语义文本样式(Font.TextStyle)使文本自动缩放。对于 UIKit,使用 UIFontMetrics 相对于基础的 UIFont.TextStyle 来缩放自定义字体。
正确示例:
// SwiftUI — 语义文本样式随“更大文本”自动缩放
Text("正在播放")
.font(.title2) // 随 UIContentSizeCategory 缩放
Text("剧集描述")
.font(.body) // 随 UIContentSizeCategory 缩放
// UIKit — 使用 UIFontMetrics 缩放自定义字体
let baseFont = UIFont(name: "CustomFont-Regular", size: 29)!
let scaledFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: baseFont)
label.font = scaledFont
label.adjustsFontForContentSizeCategory = true
错误示例:
// SwiftUI — 硬编码的大小忽略了“更大文本”偏好设置
Text("正在播放")
.font(.system(size: 29)) // 不缩放
// UIKit — 硬编码的字体忽略了 UIContentSizeCategory
label.font = UIFont(name: "CustomFont-Regular", size: 29)
// 缺少 adjustsFontForContentSizeCategory = true
在审查 tvOS 应用设计或实现时使用此清单。
isBoldTextEnabled)Font.TextStyle 或在 UIKit 中使用 UIFontMetrics)不要直接将移动端模式带到 tvOS。以下是常见的错误:
| 反模式 | 失败原因 | 正确方法 |
|---|---|---|
| 底部标签栏 | iOS 惯例;在电视上感觉不对 | 使用顶部标签栏 |
| 小的触摸目标 | 无法通过滑动导航精确瞄准 | 最小 250x150pt 的卡片 |
| 密集的文本屏幕 | 在 10 英尺距离下无法阅读 | 仅使用标题 + 简短描述 |
| 汉堡菜单 | 电视上没有点击显示交互 | 使用标签栏或基于焦点的菜单 |
| 下拉刷新 | Siri Remote 没有下拉手势 | 自动刷新或显式刷新按钮 |
| Toast 通知 | 在大电视屏幕上容易错过 | 使用模态警报或持久性横幅 |
| 滚动指示器 | 细滚动条在远处不可见 | 使用内容窥视(部分显示下一个项目) |
| 捏合缩放 | Siri Remote 上无法进行多指手势 | 提供显式的缩放控件 |
| 长表单 | 在 tvOS 上键盘输入很痛苦 | 预填充、使用配置文件或卸载到 iPhone |
| 细/浅色字体 | 在电视显示器上会消失 | 至少使用中等字重 |
每周安装量
210
代码库
GitHub 星标数
268
首次出现
2026 年 2 月 1 日
安全审计
安装于
codex178
opencode176
claude-code175
gemini-cli170
github-copilot157
cursor149
Apple TV is a living room device driven entirely by focus-based navigation and the Siri Remote. There is no pointer, no touch screen, and no mouse. Every design decision must account for the 10-foot viewing distance, the simplicity of the remote, and the lean-back nature of TV consumption.
The focus system is the foundation of all tvOS interaction. There is no cursor -- users move focus between elements using the Siri Remote touch surface.
FOCUS-01: Every interactive element must have a clearly visible focus state. The focused item must be unmistakably distinguished from unfocused items. Use scaling (typically 1.05x-1.1x), elevation via shadow, brightness changes, or border highlights. Never rely on color alone.
FOCUS-02: Focus movement must be predictable and follow a logical spatial layout. When a user swipes right, focus must move to the element visually to the right. Avoid layouts where focus jumps unexpectedly across the screen. Grid and linear layouts are safest.
FOCUS-03: Use focus guides (UIFocusGuide) to bridge gaps in layouts. When visual gaps exist between focusable elements, add invisible focus guides so the user does not get stuck. Every swipe should move focus somewhere meaningful.
FOCUS-04: Apply the parallax effect to focused items. Focused cards, posters, and icons should exhibit a subtle parallax tilt responding to touch surface movement. Use layered images (LSR format) with foreground, midground, and background layers. This communicates depth and confirms focus.
Correct:
// SwiftUI — custom focus engine with explicit focus state
struct ContentView: View {
@FocusState private var focusedItem: String?
var body: some View {
HStack(spacing: 40) {
ForEach(items) { item in
CardView(item: item)
.focusable()
.focused($focusedItem, equals: item.id)
.scaleEffect(focusedItem == item.id ? 1.1 : 1.0)
.shadow(radius: focusedItem == item.id ? 20 : 0)
.animation(.easeInOut(duration: 0.15), value: focusedItem)
}
}
}
}
Incorrect:
// SwiftUI — no focus state: unfocused and focused items look identical
struct ContentView: View {
var body: some View {
HStack(spacing: 40) {
ForEach(items) { item in
CardView(item: item)
.focusable()
// No scale, shadow, or visual change on focus
// User cannot tell which item is selected
}
}
}
}
FOCUS-05: Make focus targets large enough for comfortable navigation. Minimum recommended touch target is 250x150pt for cards. Smaller elements are difficult to land on with swipe-based navigation. Group small actions under a focused parent when possible.
FOCUS-06: Provide a default focused element on every screen. When a view appears, one element must already hold focus. Choose the most likely user intent -- typically the primary content item or the first item in a collection.
FOCUS-07: Preserve focus memory when returning to a screen. If a user navigates away and returns, focus should restore to the last focused item on that screen, not reset to the default.
FOCUS-08: Never trap focus. Users must always be able to move focus away from any element. If focus cannot leave a region, the app feels broken.
FOCUS-09: Reduce re-orientation cost. Keep row order stable, restore prior focus when returning, and prefer nearby focus destinations so users do not have to rescan the entire screen after each navigation step.
| Layer | Purpose | Movement Amount |
|---|---|---|
| Background | Static backdrop, blurred imagery | Minimal (1-2pt) |
| Midground | Primary artwork or content image | Moderate (3-5pt) |
| Foreground | Title text, logos, badges | Maximum (5-8pt) |
Use Xcode's LSR (Layered Static Image) format for static layered images in the asset catalog — the system animates them automatically on focus. For custom programmatic parallax, stack UIImageView instances and use the focus engine callbacks (didUpdateFocus(in:with:) and UIFocusAnimationCoordinator) to drive layer movement during focus transitions. (UIMotionEffect responds only to subtle Siri Remote gyroscope micromotion and is not the mechanism for focus-driven parallax.)
The Siri Remote is the primary (and often only) input device. It has a touch surface, Menu button, Play/Pause button, Siri/microphone button, volume buttons, and a power button.
REMOTE-01: Touch surface swipes control focus movement. Swiping moves focus in the corresponding direction. Clicking the touch surface selects the focused item. These are the two fundamental interactions -- design everything around them.
REMOTE-02: Menu button must always navigate back. Pressing Menu should dismiss the current screen, close an overlay, or navigate up the hierarchy. At the top level, it returns to the Apple TV home screen. Never override this expectation.
REMOTE-03: Play/Pause button must control media playback. If media is playing, Play/Pause should toggle playback regardless of what screen is visible. Do not repurpose this button for non-media actions.
REMOTE-04: Never require complex or multi-finger gestures. The Siri Remote touch surface is small. Do not require pinch, rotate, multi-tap, or long-press gestures. Stick to single-finger swipe and click.
REMOTE-05: Swipe directions must be intuitive and consistent. Horizontal swipes scroll horizontally; vertical swipes scroll vertically. Never invert axes. Diagonal content movement should follow the dominant swipe axis.
REMOTE-06: Support Siri voice input for search and text entry. Text input via the on-screen keyboard is tedious on tvOS. Always support dictation and Siri search as alternatives to keyboard entry.
REMOTE-07: Provide click feedback. When the user clicks the touch surface to select an item, provide immediate visual feedback (animation, highlight change, or haptic-style visual pulse) so the click feels responsive.
REMOTE-08: Never make the on-screen keyboard the only practical text path. For search, sign-in, and setup, prefer dictation, recent queries, autofill, or short code-based flows over long remote-typed text. Remote text entry carries high motor and cognitive cost.
Apple TV content is viewed from across a room, typically 8-12 feet (2.5-3.5 meters) from the screen. All visual design must account for this distance.
DISTANCE-01: Minimum body text size is 29pt. Text below 29pt becomes difficult to read at living room distances. Titles should be 48pt or larger. Use San Francisco Display or comparable high-legibility typeface.
DISTANCE-02: Maintain high contrast between text and backgrounds. Use light text on dark backgrounds as the default. tvOS uses a dark theme. Contrast ratio should meet WCAG AA or higher (4.5:1 for body text, 3:1 for large text).
DISTANCE-03: Limit text per screen. TV is a visual medium. Show headlines, short descriptions, and metadata -- not paragraphs. If extended text is necessary, use scrollable text overlays that the user explicitly opens.
DISTANCE-04: Use bold, clear imagery at high resolution. Full-screen background images should be 1920x1080 or 3840x2160 (4K). Content artwork should be sharp and visually engaging. Avoid small, detailed illustrations that lose clarity at distance.
DISTANCE-05: Keep layouts simple and spacious. Generous margins and padding. Do not crowd the screen with many small elements. A single row of 5-7 cards is preferable to a dense grid of 20+ thumbnails.
DISTANCE-06: Use the TV-safe area. Keep all critical content within the safe area (60pt inset from edges). Content near screen edges may be cropped on some TV sets due to overscan.
DISTANCE-07: Avoid thin fonts and hairline borders. Thin strokes disappear on TV displays, especially with motion blur and compression artifacts. Use medium or semibold weights minimum.
| Element | Minimum Size | Recommended Size |
|---|---|---|
| Body text | 29pt | 31-35pt |
| Secondary labels | 25pt | 29pt |
| Titles | 48pt | 52-76pt |
| Large headers | 64pt | 76-96pt |
| Buttons | 29pt | 35-38pt |
The Top Shelf is a prominent content area displayed when the user focuses on your app icon on the Apple TV home screen. It is prime real estate for showcasing content.
SHELF-01: Provide a Top Shelf extension. Apps should include a TVTopShelfContentProvider (tvOS 14+) that returns dynamic content. TVTopShelfProvider is deprecated since tvOS 14 — do not use it. A static Top Shelf is a missed opportunity for engagement.
SHELF-02: Use the correct layout style for your content.
SHELF-03: Top Shelf items must deep-link into the app. Each item must open the corresponding content when selected. Never link all items to the same generic landing page.
SHELF-04: Use high-quality, engaging imagery. Top Shelf images are displayed large on the home screen. Blurry, low-resolution, or text-heavy images look unprofessional. Recommended image sizes:
SHELF-05: Keep Top Shelf content fresh. Update Top Shelf content regularly -- ideally reflecting recently added, trending, or personalized content. Stale Top Shelf content signals an abandoned app.
Apple TV is primarily a media consumption device. Playback interfaces must follow established TV conventions.
MEDIA-01: Use standard transport controls. Provide play, pause, skip forward (10s), skip back (10s), and a scrubber timeline. Use AVPlayerViewController to get these for free with consistent behavior.
MEDIA-02: Show an info overlay on swipe-down during playback. Swiping down during playback should reveal an info panel showing title, description, and metadata. Swiping down again or pressing Menu dismisses it.
MEDIA-03: Support scrubbing via the touch surface. Swiping left/right on the touch surface during playback should scrub through the timeline. Show thumbnail previews during scrubbing when possible.
MEDIA-04: Support subtitles and alternative audio tracks. Provide access to subtitle selection and audio track switching via the info overlay or the standard player controls.
MEDIA-05: Support Picture in Picture where appropriate. For video content, allow PiP so users can browse other content while watching. Implement AVPictureInPictureController integration.
MEDIA-06: Remember playback position. When a user returns to previously watched content, resume from where they left off. Display a progress indicator on content thumbnails.
MEDIA-07: Handle interruptions gracefully. If the user presses the TV button or switches apps during playback, save position and pause cleanly. Resume without re-buffering when the user returns.
The tvOS tab bar sits at the top of the screen, unlike iOS where it sits at the bottom. It provides primary navigation between app sections.
TAB-01: Place the tab bar at the top of the screen. This is the standard tvOS convention. Bottom tab bars are an iOS pattern and feel wrong on TV.
TAB-02: Tab bar should be translucent and overlay content. The tab bar floats over content with a blur effect. When the user focuses on the tab bar, content shifts down to make room.
TAB-03: Use 3-7 tabs. Fewer than 3 tabs suggests the app is too simple for tab navigation. More than 7 tabs becomes difficult to navigate with horizontal swiping.
TAB-04: Every tab must have a text label. Icon-only tabs are insufficient at TV viewing distances. Text labels are required for clarity. Icons may accompany text but are not required.
TAB-05: Focus on the tab bar should feel lightweight. When focus moves to the tab bar, it should appear smoothly. Content preview should be visible beneath the translucent bar. Switching tabs should update the content below immediately or show a loading state.
TAB-06: Remember the selected tab across app launches. If the user was on the "Search" tab when they left the app, return to "Search" when they re-open it.
Apple TV supports VoiceOver. Sighted users use focus navigation; VoiceOver users additionally hear spoken descriptions. Both must work.
ACCESS-01: Every interactive element must have a meaningful accessibility label. Icon-only buttons and image cards must have labels. The focused item's name is announced by VoiceOver when focus arrives.
ACCESS-02: Provide accessibility hints for non-obvious interactions. If tapping a card does something other than opening the content (e.g., launching a trailer rather than full playback), describe this with an accessibility hint.
ACCESS-03: Ensure VoiceOver focus order matches visual focus order. VoiceOver must traverse elements in the same order that focus engine navigation produces. Custom focus ordering via UIFocusGuide must not create discontinuities in the VoiceOver reading order.
ACCESS-04: Respect Reduce Motion. Parallax effects and other animations must be reduced or disabled when the user enables Reduce Motion in Accessibility settings.
ACCESS-05: Respond to Bold Text. When the user enables Bold Text, custom-rendered text must adapt. SwiftUI dynamic type styles handle this automatically; custom text rendering must check UIAccessibility.isBoldTextEnabled or use @Environment(\.legibilityWeight).
ACCESS-06: Respond to Increase Contrast. When the user enables Increase Contrast (Darker System Colors), custom colors must provide higher-contrast variants. Use @Environment(\.colorSchemeContrast) in SwiftUI or UIAccessibility.isDarkerSystemColorsEnabled in UIKit to detect and apply appropriate values.
ACCESS-07: Respect Dynamic Type / Larger Text. tvOS supports the "Larger Text" accessibility setting via UIContentSizeCategory. Use SwiftUI semantic text styles (Font.TextStyle) so text scales automatically. For UIKit, scale custom fonts with UIFontMetrics relative to a base UIFont.TextStyle.
Correct:
// SwiftUI — semantic text styles scale with Larger Text automatically
Text("Now Playing")
.font(.title2) // Scales with UIContentSizeCategory
Text("Episode description")
.font(.body) // Scales with UIContentSizeCategory
// UIKit — scale custom font with UIFontMetrics
let baseFont = UIFont(name: "CustomFont-Regular", size: 29)!
let scaledFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: baseFont)
label.font = scaledFont
label.adjustsFontForContentSizeCategory = true
Incorrect:
// SwiftUI — hardcoded size ignores Larger Text preference
Text("Now Playing")
.font(.system(size: 29)) // Does not scale
// UIKit — hardcoded font ignores UIContentSizeCategory
label.font = UIFont(name: "CustomFont-Regular", size: 29)
// Missing adjustsFontForContentSizeCategory = true
Use this checklist when reviewing a tvOS app design or implementation.
isBoldTextEnabled)Font.TextStyle in SwiftUI or UIFontMetrics in UIKit)Do not bring mobile patterns directly to tvOS. The following are common mistakes:
| Anti-Pattern | Why It Fails | Correct Approach |
|---|---|---|
| Bottom tab bar | iOS convention; feels wrong on TV | Use top tab bar |
| Small touch targets | Cannot precisely target with swipe navigation | Minimum 250x150pt cards |
| Dense text screens | Unreadable at 10-foot distance | Headlines + short descriptions only |
| Hamburger menus | No tap-to-reveal interaction on TV | Use tab bar or focus-driven menus |
| Pull-to-refresh | No pull gesture on Siri Remote | Auto-refresh or explicit refresh button |
| Toast notifications | Easy to miss on a large TV screen | Use modal alerts or persistent banners |
| Scroll indicators | Thin scrollbars invisible at distance | Use content peek (partially visible next item) |
| Pinch-to-zoom | Multi-finger gestures impossible on Siri Remote | Provide explicit zoom controls |
Weekly Installs
210
Repository
GitHub Stars
268
First Seen
Feb 1, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex178
opencode176
claude-code175
gemini-cli170
github-copilot157
cursor149
前端设计技能指南:避免AI垃圾美学,打造独特生产级界面
42,900 周安装
| Long forms | Keyboard input is painful on tvOS | Pre-fill, use profiles, or offload to iPhone |
| Thin/light typography | Disappears on TV displays | Medium weight minimum |