推荐用 UIToolbar 实现真正动态模糊:创建无 barTintColor 的 UIToolbar,设 frame 与父视图一致,关闭 opaque 并设 backgroundColor 为 clearColor,插入视图底层,通过 barStyle 控制深色效果。

在 iOS 应用中复现 Control Center 那种随前台内容实时变化的毛玻璃背景,不能只靠静态截图+单次模糊——必须让模糊图层持续响应屏幕内容更新。系统原生控件 UIToolbar 虽自带动态模糊能力,但默认会破坏自定义颜色;而 UIVisualEffectView 仅支持预设风格,无法绑定到任意视图层级并实时捕获变化。
用 UIToolbar 实现真正动态模糊(推荐)
这一步操作起来很简单,直接把 UIToolbar 当作模糊容器嵌入即可,它内部自动监听屏幕变化并重绘模糊效果,无需手动截屏或定时刷新。
第一步:创建一个与目标区域等宽高的 UIToolbar 实例,不设置 barTintColor,避免颜色被强制覆盖;
第二步:将 UIToolbar 的 frame 设为和父视图一致,并启用 autoresizingMask → 【关键】必须关闭 opaque 属性且 backgroundColor 设为 clearColor,否则模糊失效;
第三步:插入到目标视图层级最底层(比如在 self.view 的 subviews[0] 位置),确保其他 UI 元素显示在其上方;
第四步:若需深色模糊效果,直接设置 toolbar.barStyle = UIBarStyleBlack,不要碰 tintColor 或 background 颜色——系统会自动适配当前内容亮度做动态调光。
用 UIVisualEffectView 手动绑定动态源图
适用于需要模糊特定子视图(如某个弹窗背景)而非全屏内容的场景,但必须配合定时截图才能“动”起来。
方法一:基于 UIView 快照 + 定时更新
① 在 viewDidLoad 中创建 UIVisualEffectView,effect 使用 UIBlurEffect(style: .prominent);
② 每 0.3 秒执行一次 UIGraphicsBeginImageContextWithOptions → drawViewHierarchyInRect → applyLightEffect → 替换 UIVisualEffectView 的 backgroundImageView.image;
③ 注意:drawViewHierarchyInRect 在某些动画期间可能返回空图,需加 nil 判断并 fallback 到上一帧图像;
方法二:监听 UIApplication.didBecomeActiveNotification + viewDidLayoutSubviews 双触发点,只在界面布局稳定后截一次图,省电但非真动态。
绕过系统限制:用 CIGaussianBlur + CADisplayLink 实现可控模糊
当需要精确控制模糊半径、亮度衰减、甚至叠加蒙版时,必须脱离 UIVisualEffectView,自己管理图像流。
第一步:初始化 CIContext 和 CIGaussianBlur 滤镜实例,缓存避免重复创建;
第二步:用 CADisplayLink 绑定屏幕刷新节奏,在回调中调用 UIGraphicsGetImageFromCurrentImageContext 获取当前窗口快照;
第三步:将 UIImage 转为 CIImage → 应用 CIGaussianBlur(radius 参数可 runtime 动态调节)→ 输出 CGImage → 赋给 UIImageView;
第四步:每次处理完旧图后立即调用 CIImage 的 release() 和 CGImageRelease(),【重要】否则连续运行 3 分钟以上必触发内存警告。


















