iOS中如何创建与UIActionSheet背景视图一致的自定义视图?
复刻UIActionSheet及背景视图实现方案
首先得明确一个核心限制:Apple官方明确禁止子类化UIAlertController,其内部视图层级属于私有API范畴,直接修改或自定义UIAlertAction的UI会违反App Store审核规范,所以你想通过自定义UIAlertAction改造UIActionSheet的路子确实走不通,选择复刻原生效果是完全正确的方向。
复刻UIActionSheet的细节补充
你提到用Debug View Hierarchy分析原生UIActionSheet的层级、约束、颜色等细节,这个方法非常精准。补充几个原生实现的关键细节,能让你的复刻版更贴近原生体验:
- 原生UIActionSheet的容器视图圆角通常为13pt(不同iOS版本可能略有调整)
- 操作按钮的高度在非iPad设备上约为50pt,分隔线是淡灰色半透明样式
- 取消按钮会比其他操作按钮多一层顶部间距,用来做视觉区分
类似UIActionSheet的背景视图实现方法
原生UIActionSheet的背景包含两个核心部分:半透明蒙层 + 模糊效果,下面是具体实现步骤:
1. 基础半透明蒙层(适配全iOS版本)
这是最基础的背景实现方式,适配所有iOS版本:
- 创建一个全屏
UIView,设置背景色为UIColor.black.withAlphaComponent(0.5) - 将蒙层添加到当前窗口(iOS 13+建议通过
UIWindowScene获取窗口)或当前ViewController的view上,注意层级要低于你的自定义Sheet视图 - 给蒙层添加
UITapGestureRecognizer,点击时触发Sheet的关闭动画,动画结束后移除蒙层和Sheet
2. 原生风格模糊背景(iOS 10+)
如果想要和原生UIActionSheet完全一致的模糊背景,可以使用UIVisualEffectView:
- 创建深色模糊效果并生成视图:
let blurEffect = UIBlurEffect(style: .dark) let blurView = UIVisualEffectView(effect: blurEffect) - 设置blurView的frame为全屏,或者用约束绑定到父视图四边
- 可以在blurView上叠加一层alpha为0.3的黑色视图,让模糊效果更贴近原生的深邃感
- 同样给blurView添加点击手势,用于触发Sheet关闭逻辑
3. 过渡动画优化
原生UIActionSheet弹出时,背景蒙层渐入、Sheet从底部滑入,关闭时反向执行动画,实现方式如下:
- 初始状态:蒙层alpha设为0,Sheet的transform设为
CGAffineTransform(translationX: 0, y: sheetHeight) - 弹出动画:
UIView.animate(withDuration: 0.25) { self.backgroundView.alpha = 1 self.sheetView.transform = .identity } - 关闭动画:执行反向动画,动画完成后移除蒙层和Sheet
额外注意事项
- 刘海屏适配:自定义Sheet的底部约束要绑定到
safeAreaLayoutGuide,避免被Home Indicator遮挡 - 旋转适配:监听设备旋转事件,实时更新蒙层和Sheet的布局
- 性能优化:如果使用模糊背景,避免在滚动视图上方叠加,防止出现卡顿
内容的提问来源于stack exchange,提问作者trungduc
相关产品推荐
相关产品推荐

