请教:苹果Books应用设置弹窗的实现方式是什么?
复刻苹果Books设置弹窗效果的方案
嘿,作为iOS开发过来人,我刚好研究过Books这个界面的实现~先给你明确结论:这个效果核心是基于系统的UIAlertController(.actionSheet样式),苹果在此基础上做了一些自定义UI优化(比如圆角、内部布局细节),不过作为新手,你可以先用系统组件快速实现接近的效果,之后再按需做自定义调整。
下面分两种方案给你说明:
一、用系统UIAlertController快速实现(推荐新手先尝试)
系统的.actionSheet样式弹窗,只要配置好锚定位置,就能实现“显示在设置图标下方”的效果,而且自动适配iPhone/iPad不同设备的展示逻辑:
核心步骤&代码示例
// 假设你的设置按钮是名为settingsButton的UIButton @IBAction func showSettingsPopup(_ sender: UIButton) { // 1. 创建actionSheet样式的弹窗 let settingsAlert = UIAlertController(title: "显示设置", message: nil, preferredStyle: .actionSheet) // 2. 添加设置选项(可以根据需求自定义标题、样式) settingsAlert.addAction(UIAlertAction(title: "调整字号", style: .default) { _ in // 这里写字号调整的逻辑 }) settingsAlert.addAction(UIAlertAction(title: "切换主题", style: .default) { _ in // 这里写主题切换的逻辑 }) settingsAlert.addAction(UIAlertAction(title: "取消", style: .cancel)) // 3. 设置弹窗锚定到设置按钮下方(关键!) if let popoverPresenter = settingsAlert.popoverPresentationController { popoverPresenter.sourceView = sender popoverPresenter.sourceRect = sender.bounds // 可以指定箭头指向,比如让箭头向上指向按钮 popoverPresenter.permittedArrowDirections = .up } // 4. 弹出弹窗 present(settingsAlert, animated: true) }
为什么选这个方案?
- 系统组件自带适配:自动处理不同屏幕尺寸、横竖屏切换,还支持无障碍功能(比如VoiceOver)
- 代码量少,新手容易上手,不需要自己处理动画和遮罩逻辑
二、自定义弹窗完全复刻Books效果
如果你想要和Books完全一致的UI细节(比如更细腻的圆角、带图标的选项、自定义布局),可以自己实现一个弹窗视图:
大致实现步骤
- 创建一个自定义
UIView,布局好你的设置选项(比如带图标按钮、开关控件等),设置好圆角、阴影等样式
- 创建一个自定义
- 添加一个半透明的背景遮罩视图,点击遮罩可以关闭弹窗
- 将自定义弹窗和遮罩添加到当前控制器的view上,初始状态设置为隐藏或者偏移到屏幕外
- 用
UIView.animate实现弹出动画:比如让弹窗从设置按钮下方滑入,同时遮罩渐显
- 用
- 处理关闭逻辑:点击遮罩、选项按钮时,执行反向动画隐藏弹窗
新手提示
自定义弹窗需要处理更多细节(比如布局适配、动画流畅度、边缘情况),建议先把系统组件的方案吃透,再尝试自定义。
内容的提问来源于stack exchange,提问作者bobcat




