SwiftUI 中的模糊效果詳解:.blur、.material、UIVisualEffectView

模糊效果(Blur Effect)是 iOS 用戶界面設計的重要組成部分,它被廣泛應用于系統控制中心、通知背景、彈窗蒙版等場景,營造出“毛玻璃”的視覺層次感。
本文將深入解析 SwiftUI 中實現模糊效果的三種主流方式:.blur(radius:).background(Material)、以及封裝 UIKit 的 UIVisualEffectView,并詳細說明每種方式的適用場景、性能表現及實現方式。


一、使用 .blur(radius:) 修飾符添加模糊

基礎用法

Image("photo").resizable().scaledToFill().blur(radius: 10)

在這里插入圖片描述

API 說明

  • 函數名.blur(radius:opaque:)
  • 參數
    • radius: CGFloat:模糊的半徑,數值越大,模糊越強;
    • opaque: Bool = false(可選):
      • 設置為 true 會提升性能,但會關閉透明效果;
      • 設置為 false 可以保留透明度,適用于圖像疊加。

示例:模糊前景圖像

ZStack {Image("background").resizable().scaledToFill()Image("logo").resizable().frame(width: 100, height: 100).blur(radius: 8)
}

? 適合前景局部模糊,?? 不具備“磨砂玻璃”風格的半透明模糊。
在這里插入圖片描述


二、使用系統材料 Material 實現半透明磨砂效果

從 iOS 15 起,Apple 為 SwiftUI 引入了 視覺材料 API(Material API),用于模擬 iOS 系統的磨砂玻璃風格(例如通知中心、彈窗等)。

基礎用法

Text("Hello, SwiftUI").padding().background(.ultraThinMaterial).cornerRadius(12)

API 說明

    @inlinable nonisolated public func background<S>(_ style: S, ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View where S : ShapeStyle
Material 類型
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 10.0, *)
extension ShapeStyle where Self == Material {/// A material that's somewhat translucent.public static var regularMaterial: Material { get }/// A material that's more opaque than translucent.public static var thickMaterial: Material { get }/// A material that's more translucent than opaque.public static var thinMaterial: Material { get }/// A mostly translucent material.public static var ultraThinMaterial: Material { get }/// A mostly opaque material.public static var ultraThickMaterial: Material { get }
}
  • .ultraThinMaterial:最透明的視覺效果;
  • .thinMaterial:比 ultraThin 稍微厚一點;
  • .regularMaterial:中等模糊;
  • .thickMaterial:模糊感更強;
  • .ultraThickMaterial:非常明顯的模糊層。

在這里插入圖片描述

示例:毛玻璃背景卡片

ZStack {Image("background").resizable().scaledToFill().ignoresSafeArea()VStack {Text("This is a glass card").font(.headline).foregroundColor(.white).padding().background(.ultraThinMaterial).cornerRadius(16)}
}

在這里插入圖片描述

優勢

  • 系統原生優化;
  • 自動根據暗黑/亮色模式適配背景;
  • 可疊加陰影、邊框等樣式。

三、封裝 UIKit 的 UIVisualEffectView 用于自定義模糊風格

在 SwiftUI 中,若需要更細致的控制,比如使用 .dark.extraLight 等傳統 UIKit 風格的模糊效果,可通過 UIViewRepresentable 封裝 UIKit 的 UIVisualEffectView

Step 1:創建封裝視圖組件

struct VisualEffectBlur: UIViewRepresentable {var blurStyle: UIBlurEffect.Stylefunc makeUIView(context: Context) -> UIVisualEffectView {return UIVisualEffectView(effect: UIBlurEffect(style: blurStyle))}func updateUIView(_ uiView: UIVisualEffectView, context: Context) {uiView.effect = UIBlurEffect(style: blurStyle)}
}

UIBlurEffect.Style 枚舉(UIKit)

extension UIBlurEffect {@available(iOS 8.0, *)public enum Style : Int, @unchecked Sendable {/// 非常淺的白色模糊(適合深色背景)case extraLight = 0/// 淡白色模糊,透明度適中(適合中性色背景)case light = 1/// 深色模糊,帶有黑色背景(適合淺色背景或亮色 UI)case dark = 2/// 常規模糊效果,視覺強度適中,適用于大部分場景@available(iOS 10.0, *)case regular = 4/// 強烈的模糊效果,比 regular 更加明顯@available(iOS 10.0, *)case prominent = 5// MARK: - 以下為基于系統材質的模糊效果,自動適配明/暗模式/// 極薄系統材料風格,模糊度最輕(自適應明暗模式)@available(iOS 13.0, *)case systemUltraThinMaterial = 6/// 較薄系統材料風格(比 ultraThin 稍強)@available(iOS 13.0, *)case systemThinMaterial = 7/// 常規厚度系統材料,適用于大多數模糊背景@available(iOS 13.0, *)case systemMaterial = 8/// 較厚系統材料模糊,遮擋性更強@available(iOS 13.0, *)case systemThickMaterial = 9/// 特別為 toolbar、tabbar 等 chrome UI 元素設計的材料模糊@available(iOS 13.0, *)case systemChromeMaterial = 10// MARK: - 以下為固定亮色風格的材料模糊(不會根據暗色模式變換)/// 極薄亮色材料@available(iOS 13.0, *)case systemUltraThinMaterialLight = 11/// 較薄亮色材料@available(iOS 13.0, *)case systemThinMaterialLight = 12/// 常規亮色材料@available(iOS 13.0, *)case systemMaterialLight = 13/// 厚重亮色材料@available(iOS 13.0, *)case systemThickMaterialLight = 14/// 用于亮色 UI chrome 元素的材料@available(iOS 13.0, *)case systemChromeMaterialLight = 15// MARK: - 以下為固定暗色風格的材料模糊(不會根據亮色模式變換)/// 極薄暗色材料@available(iOS 13.0, *)case systemUltraThinMaterialDark = 16/// 較薄暗色材料@available(iOS 13.0, *)case systemThinMaterialDark = 17/// 常規暗色材料@available(iOS 13.0, *)case systemMaterialDark = 18/// 厚重暗色材料@available(iOS 13.0, *)case systemThickMaterialDark = 19/// 用于暗色 UI chrome 元素的材料@available(iOS 13.0, *)case systemChromeMaterialDark = 20}
}

Step 2:在 SwiftUI 中使用

  // 枚舉所有 UIBlurEffect.Style(僅支持當前系統版本的)let blurStyles: [(name: String, style: UIBlurEffect.Style)] = [("extraLight", .extraLight),("light", .light),("dark", .dark),("regular", .regular),("prominent", .prominent),("systemUltraThinMaterial", .systemUltraThinMaterial),("systemThinMaterial", .systemThinMaterial),("systemMaterial", .systemMaterial),("systemThickMaterial", .systemThickMaterial),("systemChromeMaterial", .systemChromeMaterial),("systemUltraThinMaterialLight", .systemUltraThinMaterialLight),("systemThinMaterialLight", .systemThinMaterialLight),("systemMaterialLight", .systemMaterialLight),("systemThickMaterialLight", .systemThickMaterialLight),("systemChromeMaterialLight", .systemChromeMaterialLight),("systemUltraThinMaterialDark", .systemUltraThinMaterialDark),("systemThinMaterialDark", .systemThinMaterialDark),("systemMaterialDark", .systemMaterialDark),("systemThickMaterialDark", .systemThickMaterialDark),("systemChromeMaterialDark", .systemChromeMaterialDark),]var body: some View {ScrollView {VStack(spacing: 0) {ForEach(blurStyles, id: \.name) { item inZStack {Image("background").resizable().scaledToFill().frame(height: 150).clipped()VisualEffectBlur(blurStyle: item.style).frame(height: 150)Text(item.name).font(.title3).bold().foregroundColor(.white).shadow(radius: 2)}.frame(maxWidth: .infinity)}}}}
}

在這里插入圖片描述

實戰技巧:只模糊部分區域

示例:只模糊圓形區域

ZStack {Image("background").resizable().scaledToFill()Circle().fill(.thinMaterial).frame(width: 180, height: 180)
}

示例:自定義模糊背景加遮罩

VisualEffectBlur(blurStyle: .light).mask(RoundedRectangle(cornerRadius: 20).frame(width: 300, height: 200))

性能注意事項

技術系統要求性能表現使用建議
.blur(radius:)iOS 13+渲染開銷較高少量、靜態使用
.background(.material)iOS 15+系統優化推薦優先使用
UIVisualEffectView 封裝iOS 13+原生高效可用于舊版本

建議避免在 滾動視圖或動畫 中頻繁使用大半徑的 .blur(radius:),可以改用 Material 實現近似視覺風格但更高性能。


附加內容:模糊疊加 + 動畫

struct AnimatedBlurView: View {@State private var blurAmount: CGFloat = 0var body: some View {VStack {Image("background").resizable().scaledToFill().frame(height: 300).blur(radius: blurAmount)Text("blur value: \(blurAmount)")Slider(value: $blurAmount, in: 0...20).padding()}}
}

請添加圖片描述


總結

模糊方式系統支持適用場景控制精度
.blur(radius:)iOS 13+簡單模糊、圖片處理高(可動畫)
.background(.material)iOS 15+毛玻璃視覺、系統一致性
UIVisualEffectViewiOS 13+自定義模糊、舊系統支持

SwiftUI 通過系統級 API 與 UIKit 封裝的配合,已能滿足多數現代 iOS UI 設計中關于模糊效果的需求。選擇合適的模糊方式,不僅能提升用戶體驗,還能確保性能表現優良。


最后,希望能夠幫助到有需要的朋友,如果覺得有幫助,還望點個贊,添加個關注,筆者也會不斷地努力,寫出更多更好用的文章。

📚 推薦閱讀

  • Apple Developer - Material
  • WWDC2021: Explore visual effects in SwiftUI
  • UIVisualEffectView | Apple Documentation

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912990.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Euler2203安裝.NetCore6.0環境操作步驟

# 1. 下載.NET二進制包 wget https://download.visualstudio.microsoft.com/download/pr/xxxx/dotnet-sdk-6.0.xxx-linux-x64.tar.gz把dotnet-sdk-6.0.428-linux-x64.tar.gz放到一個目錄里面# 2. 創建安裝目錄sudo mkdir -p /usr/share/dotnetsudo tar -zxf dotnet-sdk-6.0.428…

解決安裝SunloginClient問題記錄(Ubuntu 24.04.2)

成功安裝流程&#xff08;Ubuntu 24.04.2&#xff09; 1. 首次嘗試安裝&#xff08;失敗&#xff0c;缺少依賴&#xff09; sudo dpkg -i ./SunloginClient_15.2.0.63064_amd64.deb sudo apt-get install -f # 修復依賴&#xff08;此時提示缺少 libgconf-2-4&#xff09; …

wordpress安裝教程

一、安裝軟件 1、apache sudo apt install apache2 -y 2、mysql sudo apt install mysql-server -y 3、PHP及其擴展 sudo apt install php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip php-fpm -y 重啟ap…

C#,VB.NET從JSON數據里提取數組中的對象節點值

在VB.NET中&#xff0c;若要從 JSON 數據里提取Data.DataList數組中的CategoryId&#xff0c;并將其轉換為VB.NET數組&#xff0c;可借助Json.NET&#xff08;Newtonsoft.Json&#xff09;庫來實現。下面為你詳細介紹具體的實現步驟和代碼示例&#xff1a; 一、實現 JSON 到數…

Flutter 進階:實現帶圓角的 CircularProgressIndicator

在 Flutter 中&#xff0c;我們經常使用 CircularProgressIndicator 來展示加載進度。但是你是否注意到&#xff1a;它的進度端始終是“平頭”的&#xff08;直角&#xff09;&#xff1f; 這在一些 UI 設計中并不美觀&#xff0c;特別是想實現類似 Apple 健身環那樣“前端圓清…

解決CentOS7下載docker-compose出現沒有可用軟件包問題

1 問題描述 今天在使用虛擬機CentOS 7系統安裝docker-compose時&#xff0c;用的是aliyun鏡像&#xff0c;出現沒有可用軟件包的問題&#xff0c;這就說明不是因為網絡&#xff0c;而是因為aliyun鏡像沒有該軟件包。 2 解決辦法 這里推薦最穩定的解決辦法&#xff0c;去docker-…

基于SpringBoot+Vue的酒類倉儲管理系統

文檔包含用例圖、系統架構圖、系統功能結構圖、實體屬性圖、總體e-r圖。一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架項目架構&#xff1a;B/S架構運行環境&#xff1a;win10/win11、jdk17前端&#xff1a;技術&#xff1a;框架Vue.js&a…

月付物理服務器租用平臺-青蛙云

青蛙云物理服務器租用服務概述 青蛙云是一家提供物理服務器租用服務的平臺&#xff0c;支持月付、年付等靈活付費方式&#xff0c;物理服務器適合企業或個人用戶的高性能計算需求。其服務覆蓋多地區機房&#xff0c;提供多種配置選項&#xff0c;支持定制化需求。 核心優勢 …

基于二分類方法和安全系數方法使用comsol with matlab蒙特卡洛模擬實現邊坡失效概率計算——隨機變量模型

基于二分類方法和安全系數方法使用comsol with matlab蒙特卡洛模擬實現邊坡失效概率計算——隨機變量模型 模型和全部代碼下載隨機變量模擬加載comsol模型蒙特卡洛模擬(分類模型)蒙特卡洛模擬(安全系數模型)內聚力和內摩擦角隨機變量分布二分類穩定性1000次運行結果失效概率…

機器學習-02(深度學習的基本概念)

機器學習的步驟 1.定義帶有未知參數的函數 線性模型&#xff08;linear models&#xff09;具有較大的限制&#xff08;Model Bias&#xff09; y b wx 無論如何更改b或者w&#xff0c;其只會呈現出一條直線&#xff0c;不能滿足更加復雜的現實情況。 我們可以將復雜的函…

InspireFace C++ 架構分析

InspireFace C 架構分析 https://github.com/deepinsight/insightface/tree/master/cpp-package/inspireface 1. 項目概述 InspireFace 是一個高性能的人臉識別和分析 SDK&#xff0c;采用 C 開發&#xff0c;提供了完整的人臉檢測、跟蹤、特征提取、活體檢測、屬性分析等功…

【網絡安全】Webshell命令執行失敗解決思路

前言費盡心思上傳了webshell&#xff0c;上傳下載都沒問題&#xff0c;卻發現命令執行總是失敗&#xff1f;最近也打點也遇到了這些問題&#xff0c;網上有部分文章&#xff0c;但都是零碎知識點并且實戰不一定能用&#xff0c;今天就結合我個人經驗剖析webshell上線后cmd命令執…

【機器人】復現 HOV-SG 機器人導航 | 分層 開放詞匯 | 3D 場景圖

HOV-SG 是通過語言指令實現機器人導航的&#xff0c;核心特點是分層結構、開放詞匯、3D場景圖。 來自RSS 2024&#xff0c;大規模、多層次的環境構建精確的、開放詞匯的3 場景圖&#xff0c;并使機器人能夠通過語言指令在其中有效地導航。 論文地址&#xff1a;Hierarchical …

jvm 鎖升級機制

Java 虛擬機&#xff08;JVM&#xff09;中的鎖升級機制&#xff08;也稱為鎖膨脹&#xff09;是 HotSpot 虛擬機為了優化 synchronized 關鍵字的性能而引入的一項重要技術。它的核心思想是&#xff1a;根據實際遇到的競爭激烈程度&#xff0c;動態地將鎖從開銷最小的狀態逐步升…

金蝶云星空 (9.0版本) ERP的WebApi接口隨機出現SSLException

環境&#xff1a; java-1.8.0-openjdk-1.8.0.131 hutool-all 依賴&#xff0c; 5.8.25版本 項目背景&#xff1a; 發版上線&#xff0c;用的hutool工具類 HttpUtil.createPost() &#xff0c;請求域名為https://xxx.ik3cloud.com/k3cloud 的金蝶ERP webapi接口 問題&#xff1…

用java,把12.25.pdf從最后一個點分割,得到pdf

要在Java中從文件名 12.25.pdf 的最后一個點&#xff08;.&#xff09;分割文件名和擴展名&#xff0c;可以使用 String 類的 lastIndexOf() 和 substring() 方法。以下是一個示例代碼&#xff1a; public class FileNameSplitter {public static void main(String[] args) {St…

UE5 重新編譯插件版本

打開要轉換的UE的安裝目錄&#xff0c;一直找到這個文件 不要雙擊&#xff0c;在地址欄里輸入cmd打開命令行&#xff0c;輸入如下指令 RunUAT.bat BuildPlugin -plugin"E:\OldPlugin\chatbot5.3\chatbot\chatbot.uplugin" -package"E:\NewPlugin"-plugin…

Linux下的調試器-gdb(16)

文章目錄 預備知識&#xff08;9-2.30.00&#xff09;快速認識 gdbgdb 的命令1. 更換成 cgdb2. 打和去除斷點3. 逐語句與逐過程4. 使能&#xff08;激活&#xff09;斷點 調試思想1. 找到問題&#xff08;找到問題所在的區域&#xff09;2. 查看代碼的上下文 補充調試技巧1. wa…

李宏毅NLP-7-計算分數和訓練和測試

文章目錄 分數計算訓練測試 分數計算 插入式序列生成模型的概率計算邏輯&#xff0c;核心是將 “生成序列 h 的過程” 拆解為一系列插入操作&#xff0c;并通過步驟概率的乘積計算總概率 P ( h ∣ X ) P(h∣X) P(h∣X)。以下從 模型框架、步驟分解、概率計算 三個層面解析&…

Python字符與ASCII轉換方法

在Python中&#xff0c;可以使用內置函數 ord() 和 chr() 來轉換字符和ASCII碼&#xff1a; ?獲取字符的ASCII碼? - 用 ord() ascii_code ord(A) # 返回 65 ?將ASCII碼轉為字符? - 用 chr() character chr(65) # 返回 A 示例&#xff1a; # 打印字母A-Z的ASCII碼…