
别让按钮挤出屏幕:用 AI + ViewThatFits 给 iOS 布局准备兜底
这一技教你先把宽布局和紧凑布局写成规则,再让 AI 用 SwiftUI ViewThatFits 按可用空间自动选择,并用窄屏、大字号和长文案清单独立验收。
先把「挤不下」定义成产品规则
在 iOS 页面里,最容易被忽略的不是功能有没有做出来,而是同一排操作在不同屏幕宽度、横竖屏或大字号下突然换行、被截断,甚至把主要按钮推出屏幕。产品经理如果只说一句「这里要自适应」,AI 往往会给出一堆针对设备尺寸的判断,改完一个画面,又在另一个画面出问题。
今天这一技是把「同一组内容准备几种排法」交给 SwiftUI:空间够时用横向布局,空间不够时自动换成纵向或更紧凑的布局。
ViewThatFits 会按你提供的顺序检查子视图,并选择第一个能放进当前可用空间的视图。1它不是替你设计界面,而是把「什么时候降级、降成什么样」从猜测变成一张可验收的规则表。
这招适合解决什么问题
先挑一组有明确替代方案的内容,例如:
| 场景 | 空间足够时 | 空间不足时 |
|---|---|---|
| 详情页底部操作 | 「编辑」「分享」「删除」横向排列 | 主要操作保留,次要操作改为纵向排列或收进更紧凑的区域 |
| 筛选条件 | 条件名、当前值和清除按钮同排 | 条件名与当前值上下排,清除按钮仍可触达 |
| 卡片操作 | 图标、标题和快捷按钮同排 | 快捷按钮移到下一行,标题不被挤掉 |
这里的重点不是准备一套「手机布局」和一套「平板布局」,而是准备一个「宽布局」和一个「紧凑布局」。SwiftUI 根据实际可用空间选择它们,而不是根据你预先写死的设备判断。Apple 在 WWDC22 的示例中也用横向与纵向两种按钮排列应对空间不足和 Dynamic Type 放大后的情况。2
第一步:先写一张布局规格表
在打开 AI 编码工具前,用下面四列把需求写清楚:
- 不变的内容:按钮名称、动作、顺序优先级和无障碍名称。
- 首选排法:空间足够时,哪些内容同排,哪些内容需要突出。
- 兜底排法:空间不足时,内容如何换行、堆叠或收纳;不能直接消失主要动作。
- 验收条件:小屏、横竖屏、大字号和较长文案下,用户是否仍能看见并触达关键操作。
例如「编辑」「分享」「删除」这组按钮,可以把「编辑」定为主要操作,「分享」和「删除」是次要操作;宽布局横向排列,紧凑布局改为纵向排列,但三者都保留。这样 AI 才知道它要调整的是布局,不是擅自删功能或重写交互。
第二步:给 AI 一张能执行的缺陷单
把下面这段改成你的页面名称后,直接交给 AI:
请检查操作区域名称在 iPhone 窄屏、横屏和大字号下是否会横向溢出或挤压主要按钮。请保留现有按钮文案、动作、顺序优先级、无障碍标签和加载状态,不要改业务逻辑。请把同一组操作拆成「宽布局」与「紧凑布局」两个私有视图,用 SwiftUIViewThatFits(in: .horizontal)按顺序放入:先放宽布局,再放紧凑布局。空间足够时优先使用宽布局,空间不足时让紧凑布局接管。不要用设备型号判断,也不要用固定屏幕宽度写死断点。请补充 Preview 或可重复的验收入口,至少覆盖窄屏、横屏、大字号和较长按钮文案;如果项目最低系统版本低于 iOS 16,请先标出兼容性问题,不要默默提高部署版本。
核心结构其实很短:
ViewThatFits(in: .horizontal) {
WideActions()
CompactActions()
}WideActions 放在前面不是排版习惯,而是选择优先级:ViewThatFits 会先尝试它,放不下时才继续看后面的方案。实践中,把两种排法拆成独立视图也更容易分别检查,避免为了一个窄屏问题改坏宽屏布局。3第三步:按「会不会挤」而不是「像不像设计稿」验收
在 Xcode Preview 或模拟器里,按这组顺序检查:
- 正常宽度:空间足够时是否仍使用宽布局,主要操作是否有清晰的视觉优先级。
- 窄屏或横屏:缩小可用宽度后,是否切换到紧凑布局;有没有按钮消失、文字被裁切或点击区域变得难以触达。
- 大字号:将 Dynamic Type 调大,确认按钮和说明文字变长后仍能完整阅读。Apple 的示例正是用可用空间和 Dynamic Type 变化来触发布局替代。2
- 较长文案:把「分享」替换成更长的本地化文案,或使用真实业务中的长标题,确认紧凑布局不是只对短中文成立。
- 动作完整性:在两种布局中分别点击每个操作,确认动作、加载中禁用状态、成功反馈和错误提示都没有被布局重构带走。
- 回到宽布局:从窄屏或大字号恢复正常设置,确认布局能切回来,且不会留下重复按钮、错误间距或失去焦点。
Xcode 的设备变体预览可以帮助你快速观察不同设备方向和 Dynamic Type 组合;但预览只负责发现布局问题,关键动作仍要在模拟器或真机上点击一遍。3
这招的边界:它不是自动设计师
ViewThatFits 适合在你已经知道「宽布局」和「紧凑布局」分别长什么样时,自动选择其中一套。Apple 的官方示例也是先准备横向与纵向的替代布局,再让系统根据空间选择。2因此有三件事不要交给它猜:
- 不要只做两份完全相同的布局:如果紧凑方案没有真的减少横向占用,就没有兜底价值。
- 不要把主要操作藏没:空间不足时可以换位置或降低次要操作的优先级,不能让用户找不到完成任务的路径。
- 不要拿它替代所有响应式设计:复杂的内容重排、滚动策略、信息层级变化,仍要先写清产品规则;
ViewThatFits只负责在候选视图中选一套能放下的方案。
如果项目要支持 iOS 16 以下版本,也要先和 AI 确认部署范围。
ViewThatFits 是 iOS 16 引入的 SwiftUI 能力,不能为了今天修一个布局问题就无声改变项目的最低系统版本。3PM 今天可以独立完成的清单
- 找一个已经出现「按钮挤压、换行或截断」的操作区域。
- 写出宽布局、紧凑布局,以及两者都不能丢的内容和动作。
- 把上面的缺陷单交给 AI,要求只改布局,不改业务逻辑。
- 编译并确认 AI 使用的是
ViewThatFits(in: .horizontal),且宽布局在前、紧凑布局在后。 - 用窄屏、横屏、大字号和长文案各跑一遍验收清单。
- 把仍然溢出、动作丢失或切换异常的画面截图,连同「在哪种空间下出现」发回给 AI 做定向修复。
你不需要先学会计算每个设备的断点。先把「空间变小时,产品允许怎样降级」写清楚,再让 AI 把两种已确定的排法交给
ViewThatFits 选择,通常比反复试固定宽度更容易验收,也更不容易漏掉大字号和长文案这些真实场景。関連コンテンツ
- ログインするとコメントできます。
More from this channel›
- 别让刷新把人送回顶部:用 AI + SwiftUI scrollPosition 记住阅读位置
- 别让横滑卡片停得没规律:用 AI + SwiftUI viewAligned 把卡片吸附到位
- 别让错误藏在屏幕外:用 AI + ScrollViewReader 把 iOS 表单定位到首个问题
- 别让用户切回页面又重来:用 AI + @SceneStorage 保存 iOS 当前状态
- 别让弹层一上来盖满屏:用 AI + presentationDetents 让 iOS 操作按高度分层
- 别让慢请求覆盖新选择:用 AI + SwiftUI task(id:) 管住筛选结果
- 别让图片加载只剩空白:用 AI + AsyncImage 补齐加载和失败状态
- 别让 iPad 版只是放大 iPhone:用 AI + NavigationSplitView 做双栏界面
