.blur()调整器用法

在 SwiftUI 中,.blur() 是一个修饰符(Modifier),用于对视图应用高斯模糊效果,使其产生视觉上的柔化或虚化。它常用于创建磨砂玻璃效果(如 iOS 控制中心背景)、聚焦高亮或艺术化处理。以下是它的详细解析和实际应用指南:


1. 基本语法

基础模糊

swift 复制代码
.blur(radius: CGFloat) // radius: 模糊半径(值越大越模糊)
  • 参数
    • radius:模糊强度,单位为 pt
      • 0:无模糊(默认)。
      • 5:轻度模糊(适合背景虚化)。
      • 20:重度模糊(内容不可辨)。

可选项:模糊形状控制

swift 复制代码
.blur(radius: CGFloat, opaque: Bool) // opaque: 是否允许不透明渲染(性能优化)
  • opaque
    • 设为 true 可提升渲染性能(但要求模糊层下的内容不透明)。
    • 默认为 false(支持透明背景)。

2. 核心功能

(1)基础模糊效果

swift 复制代码
Image("Mountain")
    .resizable()
    .blur(radius: 8) // 中度模糊

效果

图片呈现高斯模糊效果,类似毛玻璃。

(2)局部模糊(配合遮罩)

swift 复制代码
ZStack {
    Image("Document") // 底层清晰内容
    Text("机密")
        .font(.largeTitle)
        .padding()
        .background(.ultraThinMaterial) // iOS 风格磨砂背景
        .blur(radius: 2) // 增强模糊
}

(3)动态交互模糊

swift 复制代码
@State private var isBlurred = false

Button("切换模糊") {
    withAnimation {
        isBlurred.toggle()
    }
}
.blur(radius: isBlurred ? 10 : 0) // 点击时模糊

3. 实际应用场景

场景 1:磨砂玻璃背景(iOS 风格)

swift 复制代码
ZStack {
    Image("Wallpaper") // 背景图
        .resizable()
        .scaledToFill()
        .blur(radius: 20) // 重度模糊
    
    VStack {
        Text("控制中心")
            .font(.title)
        Slider(value: $volume)
    }
    .padding()
    .background(.ultraThinMaterial) // 半透明磨砂层
}

场景 2:聚焦高亮(模糊非焦点内容)

swift 复制代码
ZStack {
    VStack {
        Text("次要内容").blur(radius: isFocused ? 5 : 0)
        Text("主要内容").bold()
        Text("其他说明").blur(radius: isFocused ? 5 : 0)
    }
    
    if isFocused {
        RoundedRectangle(cornerRadius: 10)
            .stroke(Color.blue, lineWidth: 2)
    }
}

场景 3:艺术化图片处理

swift 复制代码
Image("Portrait")
    .resizable()
    .blur(radius: 2) // 轻微柔化
    .contrast(1.2)   // 增强对比度
    .saturation(0.8) // 降低饱和度

4. 与其他修饰符的关系

修饰符 作用 .blur() 的区别
.opacity() 调整透明度 模糊保留内容形状但视觉柔化
.brightness() 调整亮度 模糊不改变颜色,仅柔化边缘
.contrast() 调整对比度 模糊通常需要配合对比度修正

5. 注意事项

  1. 性能影响

    • 高模糊半径(如 radius > 10)对性能消耗较大,尤其在动态变化时。
    • 对复杂视图模糊时,建议用 .drawingGroup() 提升渲染效率。
  2. 模糊与透明度的结合

    • 模糊效果在透明背景下更明显(如配合 .opacity(0.8))。
  3. 平台差异

    • macOS 的模糊效果可能与 iOS 略有不同(需实际测试)。

6. 完整代码示例

动态模糊 + 动画

swift 复制代码
struct BlurExample: View {
    @State private var blurRadius: CGFloat = 0
    
    var body: some View {
        VStack {
            Image("Landscape")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .blur(radius: blurRadius) // 动态模糊
                .animation(.easeInOut, value: blurRadius)
            
            Slider(value: $blurRadius, in: 0...20)
                .padding()
        }
    }
}

总结

功能 代码示例
基础模糊 .blur(radius: 5)
磨砂玻璃 .blur(radius: 20).background(.ultraThinMaterial)
动态模糊 .blur(radius: isActive ? 10 : 0).animation(...)

核心用途

✅ 创建 iOS 风格磨砂背景

✅ 实现焦点引导(模糊次要内容)

✅ 图片艺术化处理

通过合理使用 .blur(),可以显著提升界面的视觉层次和沉浸感! 🎆

相关推荐
独立开阀者_FwtCoder1 分钟前
狂收 33k+ star!全网精选的 MCP 一网打尽!!
java·前端·javascript
昔冰_G21 分钟前
解锁webpack:对html、css、js及图片资源的抽离打包处理
前端·javascript·css·webpack·npm·html·打包
萌萌哒草头将军28 分钟前
🚀 REST API 还是 ✈️ GraphQL ❓
前端·vue.js·react.js
just小千42 分钟前
重学React(一):描述UI
前端·react.js·ui
fakaifa1 小时前
【最新版】沃德代驾源码全开源+前端uniapp
前端·小程序·uni-app·开源·php·沃德代驾·代驾小程序
清羽_ls1 小时前
leetcode-位运算
前端·算法·leetcode·位运算
李菠菜1 小时前
利用Nginx实现高性能的前端打点采集服务(支持GET和POST)
linux·前端·nginx
lilye662 小时前
精益数据分析(6/126):深入理解精益分析的核心要点
前端·人工智能·数据分析
Apifox2 小时前
Apifox 4月更新|Apifox在线文档支持LLMs.txt、评论支持使用@提及成员、支持为团队配置「IP 允许访问名单」
前端·后端·ai编程
Jolyne_2 小时前
搭建公司前端脚手架
前端·架构·前端框架