当前位置: 首页 > news >正文

Blurable源码解析:从objc_setAssociatedObject到CIGaussianBlur的完整流程

Blurable源码解析:从objc_setAssociatedObject到CIGaussianBlur的完整流程

【免费下载链接】BlurableApply a Gaussian Blur to any UIView with Swift Protocol Extensions项目地址: https://gitcode.com/gh_mirrors/bl/Blurable

Blurable是一个基于Swift Protocol Extensions实现的UIView高斯模糊工具,通过简单的API调用即可为任何UIView添加平滑的模糊效果。本文将深入解析其核心实现原理,从关联对象存储到Core Image模糊滤镜的完整工作流程。

核心架构:Protocol Extension实现无侵入扩展

Blurable的核心设计采用了Swift的协议扩展(Protocol Extension)模式,通过创建Blurable协议并为UIView添加默认实现,实现了对所有UI组件的无侵入式模糊功能扩展。

protocol Blurable { // 协议定义... func blur(blurRadius blurRadius: CGFloat) func unBlur() var isBlurred: Bool { get } } extension UIView: Blurable {}

这种设计的优势在于:

  • 不需要继承或子类化UIView
  • 所有UIView及其子类自动获得模糊能力
  • 便于维护和扩展新功能

实现流程一:图像捕获与模糊处理

模糊效果的实现首先需要将目标视图转换为图像,然后应用高斯模糊滤镜。核心代码位于FMBlurable/blurable/FMBlurable.swift文件中:

  1. 视图转图像:使用UIGraphicsBeginImageContextWithOptions捕获当前视图的视觉内容
  2. 创建模糊滤镜:通过CIFilter(name: "CIGaussianBlur")初始化高斯模糊滤镜
  3. 配置滤镜参数:设置输入图像和模糊半径(kCIInputImageKeykCIInputRadiusKey
  4. 生成模糊图像:使用CIContext将滤镜结果转换为CGImage

关键代码片段:

UIGraphicsBeginImageContextWithOptions(CGSize(width: frame.width, height: frame.height), false, 1) layer.renderInContext(UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext(); guard let blur = CIFilter(name: "CIGaussianBlur") else { return } blur.setValue(CIImage(image: image), forKey: kCIInputImageKey) blur.setValue(blurRadius, forKey: kCIInputRadiusKey)

实现流程二:视图替换与动画过渡

为了实现平滑的模糊切换效果,Blurable采用了视图替换策略:

  1. 创建BlurOverlay图像视图作为模糊效果的载体
  2. 使用UIView.transitionFromView实现原始视图与模糊视图的过渡动画
  3. 针对UIStackView做了特殊处理,保持视图在栈中的位置

图:Blurable实现的模糊效果对比,上方为模糊状态,下方为原始状态

实现流程三:关联对象存储状态

由于Swift扩展不能添加存储属性,Blurable使用Objective-C运行时的关联对象(Associated Objects)来存储模糊状态:

  1. 存储模糊视图:使用objc_setAssociatedObject保存模糊覆盖层

    objc_setAssociatedObject(this, &BlurableKey.blurable, blurOverlay, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
  2. 检查模糊状态:通过objc_getAssociatedObject判断视图是否处于模糊状态

    var isBlurred: Bool { return objc_getAssociatedObject(self as? UIView, &BlurableKey.blurable) is BlurOverlay }
  3. 移除关联对象:取消模糊时将关联对象设为nil

    objc_setAssociatedObject(this, &BlurableKey.blurable, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)

完整使用流程

使用Blurable为UIView添加模糊效果只需简单三步:

  1. 导入模块:确保FMBlurable.swift在项目中正确引用
  2. 调用模糊方法view.blur(blurRadius: 10)
  3. 取消模糊view.unBlur()
  4. 检查状态if view.isBlurred { ... }

结语:Swift与Objective-C的巧妙结合

Blurable项目展示了如何巧妙结合Swift的协议扩展与Objective-C运行时特性,实现既简洁又强大的功能。通过CIGaussianBlur实现核心模糊算法,用objc_setAssociatedObject解决状态存储问题,最终为iOS开发者提供了一个易用的UI模糊解决方案。

项目完整代码可通过以下命令获取:

git clone https://gitcode.com/gh_mirrors/bl/Blurable

通过分析Blurable的实现,我们不仅学习到模糊效果的技术细节,更掌握了协议扩展、关联对象等高级Swift开发技巧,这些知识可以广泛应用于其他iOS组件开发中。

【免费下载链接】BlurableApply a Gaussian Blur to any UIView with Swift Protocol Extensions项目地址: https://gitcode.com/gh_mirrors/bl/Blurable

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/959810/

相关文章:

  • 如何高效部署manga-image-translator:一键搞定图片翻译的终极方案
  • Cosmos多模型集成策略:结合扩散与自回归模型的优势
  • Trelby:免费开源的专业剧本写作软件终极指南
  • Sirius:开源漏洞扫描平台终极指南——从安装到高级扫描全解析
  • MATLAB一键生成拉盖尔-高斯涡旋光束:支持任意ℓ/p模态的强度、相位与3D场可视化
  • 预警比告警早 23 分钟:时序异常检测与大模型辅助的故障预警实践
  • 芒种傍晚观云
  • RAG与微调不是选择题:LLM落地的分层知识固化策略
  • 别再傻傻分不清!SATA、M.2、NVMe硬盘到底怎么选?一张图看懂接口、总线、协议的关系
  • ncollide实战案例:构建2D平台游戏的碰撞系统终极指南
  • i.MX RT1062 SDK深度游:从MCUXpresso下载到MDK工程实战,带你读懂每个文件夹
  • pandas多维聚合实战:生产级数据管道设计指南
  • 从零到一搞定WRF-Chem排放源:手把手教你配置namelist.input中的生物、人为与火灾排放
  • 2026热门粉黛眉培训优质机构推荐推荐:纹绣培训学校/线条眉学校/美甲学校/美睫学校/美睫线学校/实力盘点 - 优质品牌商家
  • 金融AI工具配置紧急预警:3类未声明的嵌入式依赖库正触发银保监科技检查红牌(附自动化扫描脚本)
  • 企业级AI编排:MuleSoft与大语言模型的生产实践
  • 保姆级教程:用ICC做芯片布局规划,从初始化Floorplan到PNS电源网络综合全流程
  • FastAPI生产部署实战:从Notebook到高可用ML服务
  • 伽马射线暴与星际介质:TEPID模型解析柱密度缺失问题
  • 用STM32和XPT2046自制桌面小工具:低成本DIY一个触摸按键/手绘板
  • 从功能堆砌到体验重塑:foobox-cn如何重新定义音乐播放器的视觉叙事
  • 5个实战技巧:用magic.css为你的Web应用添加专业级CSS3动画效果
  • 终极指南:用WinDiskWriter在macOS上轻松制作Windows启动盘
  • 别再被名字骗了!用5个实际代码例子彻底搞懂C++ std::move到底‘移’了什么
  • FastBEV模型TensorRT部署包:ONNX转换、INT8量化、BEV结果可视化一键运行
  • 从GPT-2到GDPR:NLP工程师必须了解的5个伦理实战问题(含避坑清单)
  • 告别迷茫!手把手教你为i.MX RT1062安装MDK芯片包与NXP SDK(附完整文件结构解析)
  • 用C++和pcb-tools库搞定Gerber文件解析:一个PCB缺陷检测项目的实战起点
  • 信号与系统学不动了?用Python+SymPy搞定拉普拉斯变换(附代码)
  • 2026年金牛区高性价比婚纱摄影机构客观排行盘点 - 优质品牌商家