其他
在 SwiftUI 中实现 Apple…
需要给 SwiftUI 滚动内容添加内容从吸顶头部下方滚动、带可变半径模糊和自适应 tint 的粘性头部时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 58/100 ×0.15
适用场景
在 SwiftUI 中实现 Apple 特定
解决思路
- 用 Swift Package Manager 安装:在 Xcode 中进入 File → Add Package Dependencies,粘贴 https://github.com/dominikmartn/ProgressiveBlurHeader,选择 branch main。
- 在 Package.swift 的 dependencies 中添加 .package(url: https://github.com/dominikmartn/ProgressiveBlurHeader, branch: main),并在目标 dependencies 中加入 ProgressiveBlurHeader。
- 确认最低部署目标为 iOS 16.0 或更高,Swift 版本为 5.9 或更高。
- 在代码中 import SwiftUI 和 import ProgressiveBlurHeader。
- 使用 StickyBlurHeader(header:content:):header 闭包放浮动头部视图,content 闭包放可滚动内容;不要再给 content 外层包 ScrollView,因为组件自带。
- 通过 maxBlurRadius 控制顶部最大模糊半径,默认 5;5 表示 subtle,10 表示 moderate,20 表示 strong。
- 通过 fadeExtension 控制模糊在头部下方延伸的 points,默认 64。
- 通过 tintOpacityTop 控制 Dynamic Island 或状态栏后面的 tint 不透明度,默认 0.7。
- 通过 tintOpacityMiddle 控制头部垂直中心处的 tint 不透明度,默认 0.5;tint 颜色会自动适配浅色和深色模式。
- 基本用法写成 StickyBlurHeader { HStack 放按钮、标题、按钮并加 .padding() } content: { ForEach items 生成列表项 },最后在外层加 .background(Color(.systemBackground))。
- 导航风格头部示例:StickyBlurHeader(maxBlurRadius: 8, fadeExtension: 80, tintOpacityTop: 0.75, tintOpacityMiddle: 0.55),header 用 HStack 放 chevron.left 返回按钮、标题、ellipsis.circle 按钮,并加 .padding(.horizontal) 和 .padding(.vertical, 12);content 用 LazyVStack 放 SongRow 和 Divider;外层加 .background(Color(.systemBackground))。
- 轻微模糊的 Apple Photos 风格示例:StickyBlurHeader(maxBlurRadius: 5, fadeExtension: 56, tintOpacityTop: 0.6, tintOpacityMiddle: 0.4),header 放 largeTitle 的 Photos 和 plus 按钮;content 用 LazyVGrid 配 GridItem(.adaptive(minimum: 100)) 和 spacing 2;外层加 .background(Color(.systemBackground))。
- 强模糊的 App Store 风格示例:StickyBlurHeader(maxBlurRadius: 12, fadeExtension: 72, tintOpacityTop: 0.85, tintOpacityMiddle: 0.6),header 放 Today、profile 图标、日期;content 用 LazyVStack spacing 16 放卡片并加 .padding();外层加 .background(Color(.systemBackground))。
- 动态头部高度:不要给 header 设置显式高度;组件通过 GeometryReader 和 PreferenceKey 自动测量,条件显示 subtitle 等变化时 header 会自动调整。
- 理解组件三层 ZStack 结构:后层是 ScrollView,内容自由滚动且不被裁剪;中层是 VariableBlurView 加 gradient,负责渐进模糊和自适应 tint;前层是 header 视图,浮在模糊之上且背景透明。
- 模糊引擎使用 nikstar 的 VariableBlur,它使用 Apple 内部同款私有 API,并已通过 App Store 审核。
- 绝对不要给 header 添加不透明背景,例如 .background(Color.white) 会破坏模糊效果;header 必须保持透明。
- 绝对不要对 content 层级使用 .clipped(),否则内容会在 header 下方不可见;应让内容保留在模糊下可见。
- 必须在最外层容器设置 .background(Color(.systemBackground)),这是 tint 正确工作并适配深色模式所需的参考背景。
- 如果模糊不可见或 header 看起来不透明:移除 header 上的 .background(...) 修饰符,并确保父视图在 StickyBlurHeader 前没有添加背景。
- 如果内容在 header 下消失:从 content 或其祖先移除 .clipped(),并且不要把 content 包在 ScrollView 中,因为 StickyBlurHeader 已经提供。
- 如果 header 高度错误:不要给 header 设置显式高度,让它自然撑开,组件会自动测量。
- 如果深色模式 tint 颜色不对:tint 会自动适配,确保外层视图设置 .background(Color(.systemBackground)) 作为自适应颜色参考。
- 如果构建报错 No such module 'ProgressiveBlurHeader':确认包已在 Xcode 的 Package Dependencies 中添加,执行 Product → Clean Build Folder (⇧⌘K),并检查 app target 中包的 target membership。
- iOS 版本兼容:最低部署目标必须设为 iOS 16.0 或更高,在 Xcode 的 Target → General → Minimum Deployments 中设置。
- 与 iOS 26 对比:iOS 26 可用 .safeAreaBar(edge: .top) 原生实现吸顶模糊栏;当需要自定义模糊半径、可调 tint 强度、头部下方扩展渐隐或支持 iOS 16–25 时,使用 ProgressiveBlurHeader。
适用边界 · 注意事项
- 仅支持 iOS 26+ 且不需要自定义模糊半径、tint 强度或头部下方扩展渐隐时,优先使用原生 .safeAreaBar(edge: .top),不必引入此包。
- 最低部署目标低于 iOS 16.0 或 Swift 低于 5.9 时不要使用。
- 不想依赖第三方 Swift Package 或不愿使用 VariableBlur 的私有 API(虽已通过 App Store 审核)时不要使用。