redacted(reason:)
是什么?
#
redacted(reason:)
是 SwiftUI 提供的一个视图修饰符,用于隐藏或模糊内容,通常用于:
- Skeleton Loading(骨架屏):在数据加载前显示灰色占位符。
- 隐藏敏感信息(iOS 15+):如银行卡号、地址、个人信息等,确保隐私安全。
redacted(reason:)
的基本用法
#
redacted(reason:)
需要传入 RedactionReasons
,指明隐藏方式。例如:
struct LoadingView: View {
@State private var isLoading = true
var body: some View {
VStack {
Text("User Name")
Text("user@example.com")
}
.redacted(reason: isLoading ? .placeholder : [])
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
isLoading = false
}
}
}
}
📌 效果:
isLoading = true
时,Text
显示灰色占位条(Skeleton UI)。- 3 秒后数据加载完成,视图恢复正常内容。
什么时候使用 redacted(reason:)
?
#
✅ 骨架屏(Skeleton UI)
- 在
List
、VStack
或HStack
里应用redacted(reason: .placeholder)
,提升加载体验。
✅ 隐藏敏感信息(iOS 15+)
- 例如银行卡号、隐私数据,结合
.privacySensitive
让系统决定是否显示内容。
✅ 渐进式数据加载
- 在部分数据可见,部分仍在加载时,使用
.redacted(reason: .placeholder)
让 UI 更平滑。
RedactionReasons
总结
#
RedactionReasons
是一个 OptionSet
,可以组合多个选项:
选项 | 作用 | 适用场景 |
---|---|---|
.placeholder | 将 Text 、Image 变为灰色方块 | 加载占位符(Skeleton UI) |
.privacySensitive | 隐藏敏感信息(iOS 15+) | 用户隐私数据(如银行信息、地址等) |
注意:
.placeholder
手动控制,主要用于加载状态。.privacySensitive
系统控制,例如Screen Time
可能自动模糊内容。
移除 redacted
效果
#
如果 redacted(reason:)
作用于整个 VStack
,但你希望某些视图仍然可见,可以使用 .unredacted()
:
struct PartialRedactionView: View {
var body: some View {
VStack {
Text("Title")
.font(.largeTitle)
.unredacted() // 这个文本始终可见
Text("Subtitle")
.redacted(reason: .placeholder)
}
}
}
📌 Title
始终显示,Subtitle
变成灰色占位符。
总结 #
redacted(reason:)
用于隐藏或模糊视图内容,常用于加载状态或隐私保护。RedactionReasons
有.placeholder
(占位符) 和.privacySensitive
(敏感信息)。.unredacted()
可移除redacted
效果,让部分视图保持可见。
📌 最佳实践:
- 数据未加载时用
.placeholder
,让 UI 更顺滑。 - 需要隐藏隐私信息时用
.privacySensitive
,系统可根据设置自动处理。