Loading...
Loading...
Compare original and translation side by side
Skill by ara.so — Daily 2026 Skills collection.
由ara.so提供的Skill — 属于Daily 2026 Skills合集。
https://github.com/dominikmartn/ProgressiveBlurHeadermainhttps://github.com/dominikmartn/ProgressiveBlurHeadermaindependencies: [
.package(url: "https://github.com/dominikmartn/ProgressiveBlurHeader", branch: "main"),
].target(
name: "YourApp",
dependencies: ["ProgressiveBlurHeader"]
)dependencies: [
.package(url: "https://github.com/dominikmartn/ProgressiveBlurHeader", branch: "main"),
].target(
name: "YourApp",
dependencies: ["ProgressiveBlurHeader"]
)StickyBlurHeaderStickyBlurHeaderViewBuilderheadercontentStickyBlurHeader(
maxBlurRadius: Double, // Default: 5
fadeExtension: CGFloat, // Default: 64
tintOpacityTop: Double, // Default: 0.7
tintOpacityMiddle: Double // Default: 0.5
) {
// header view (NO opaque background)
} content: {
// scrollable content
}ViewBuilderheadercontentStickyBlurHeader(
maxBlurRadius: Double, // 默认值:5
fadeExtension: CGFloat, // 默认值:64
tintOpacityTop: Double, // 默认值:0.7
tintOpacityMiddle: Double // 默认值:0.5
) {
// 头部视图(不要设置不透明背景)
} content: {
// 可滚动内容
}| Parameter | Type | Default | Description |
|---|---|---|---|
| | | Max blur at the top edge. 5 = subtle, 10 = moderate, 20 = strong |
| | | Points below the header the blur extends |
| | | Tint behind Dynamic Island / status bar |
| | | Tint at the header's vertical center |
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| | | 顶部边缘的最大模糊半径。5=柔和,10=中等,20=强烈 |
| | | 模糊效果延伸到头部下方的点数 |
| | | 动态岛/状态栏后方的色调透明度 |
| | | 头部垂直中心位置的色调透明度 |
import SwiftUI
import ProgressiveBlurHeader
struct ContentView: View {
let items = (1...50).map { "Item \($0)" }
var body: some View {
StickyBlurHeader {
// Header — NO opaque background
HStack {
Button("Back") { }
Spacer()
Text("Library").font(.headline)
Spacer()
Button("Settings") { }
}
.padding()
} content: {
ForEach(items, id: \.self) { item in
Text(item)
.frame(maxWidth: .infinity, alignment: .leading)
.padding()
.background(Color(.secondarySystemBackground))
.cornerRadius(8)
.padding(.horizontal)
}
}
.background(Color(.systemBackground))
}
}import SwiftUI
import ProgressiveBlurHeader
struct ContentView: View {
let items = (1...50).map { "Item \($0)" }
var body: some View {
StickyBlurHeader {
// 头部 — 不要设置不透明背景
HStack {
Button("Back") { }
Spacer()
Text("Library").font(.headline)
Spacer()
Button("Settings") { }
}
.padding()
} content: {
ForEach(items, id: \.self) { item in
Text(item)
.frame(maxWidth: .infinity, alignment: .leading)
.padding()
.background(Color(.secondarySystemBackground))
.cornerRadius(8)
.padding(.horizontal)
}
}
.background(Color(.systemBackground))
}
}import SwiftUI
import ProgressiveBlurHeader
struct AlbumDetailView: View {
let albumTitle: String
@Environment(\.dismiss) private var dismiss
var body: some View {
StickyBlurHeader(
maxBlurRadius: 8,
fadeExtension: 80,
tintOpacityTop: 0.75,
tintOpacityMiddle: 0.55
) {
HStack {
Button {
dismiss()
} label: {
Image(systemName: "chevron.left")
.fontWeight(.semibold)
}
Spacer()
Text(albumTitle)
.font(.headline)
.lineLimit(1)
Spacer()
Button {
// action
} label: {
Image(systemName: "ellipsis.circle")
}
}
.padding(.horizontal)
.padding(.vertical, 12)
} content: {
LazyVStack(spacing: 0) {
ForEach(0..<30) { index in
SongRow(index: index)
Divider().padding(.leading)
}
}
}
.background(Color(.systemBackground))
}
}import SwiftUI
import ProgressiveBlurHeader
struct AlbumDetailView: View {
let albumTitle: String
@Environment(\.dismiss) private var dismiss
var body: some View {
StickyBlurHeader(
maxBlurRadius: 8,
fadeExtension: 80,
tintOpacityTop: 0.75,
tintOpacityMiddle: 0.55
) {
HStack {
Button {
dismiss()
} label: {
Image(systemName: "chevron.left")
.fontWeight(.semibold)
}
Spacer()
Text(albumTitle)
.font(.headline)
.lineLimit(1)
Spacer()
Button {
// 操作
} label: {
Image(systemName: "ellipsis.circle")
}
}
.padding(.horizontal)
.padding(.vertical, 12)
} content: {
LazyVStack(spacing: 0) {
ForEach(0..<30) { index in
SongRow(index: index)
Divider().padding(.leading)
}
}
}
.background(Color(.systemBackground))
}
}StickyBlurHeader(
maxBlurRadius: 5,
fadeExtension: 56,
tintOpacityTop: 0.6,
tintOpacityMiddle: 0.4
) {
HStack {
Text("Photos")
.font(.largeTitle)
.fontWeight(.bold)
Spacer()
Button {
// action
} label: {
Image(systemName: "plus")
}
}
.padding(.horizontal)
.padding(.top, 8)
.padding(.bottom, 12)
} content: {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 100))], spacing: 2) {
ForEach(photos) { photo in
PhotoThumbnail(photo: photo)
}
}
.padding(2)
}
.background(Color(.systemBackground))StickyBlurHeader(
maxBlurRadius: 5,
fadeExtension: 56,
tintOpacityTop: 0.6,
tintOpacityMiddle: 0.4
) {
HStack {
Text("Photos")
.font(.largeTitle)
.fontWeight(.bold)
Spacer()
Button {
// 操作
} label: {
Image(systemName: "plus")
}
}
.padding(.horizontal)
.padding(.top, 8)
.padding(.bottom, 12)
} content: {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 100))], spacing: 2) {
ForEach(photos) { photo in
PhotoThumbnail(photo: photo)
}
}
.padding(2)
}
.background(Color(.systemBackground))StickyBlurHeader(
maxBlurRadius: 12,
fadeExtension: 72,
tintOpacityTop: 0.85,
tintOpacityMiddle: 0.6
) {
VStack(spacing: 4) {
HStack {
Text("Today")
.font(.largeTitle)
.fontWeight(.bold)
Spacer()
Button {
// profile action
} label: {
Image(systemName: "person.crop.circle.fill")
.font(.title2)
}
}
HStack {
Text(Date(), style: .date)
.font(.subheadline)
.foregroundStyle(.secondary)
.textCase(.uppercase)
Spacer()
}
}
.padding(.horizontal)
.padding(.vertical, 12)
} content: {
LazyVStack(spacing: 16) {
ForEach(featuredApps) { app in
AppCard(app: app)
}
}
.padding()
}
.background(Color(.systemBackground))StickyBlurHeader(
maxBlurRadius: 12,
fadeExtension: 72,
tintOpacityTop: 0.85,
tintOpacityMiddle: 0.6
) {
VStack(spacing: 4) {
HStack {
Text("Today")
.font(.largeTitle)
.fontWeight(.bold)
Spacer()
Button {
// 个人资料操作
} label: {
Image(systemName: "person.crop.circle.fill")
.font(.title2)
}
}
HStack {
Text(Date(), style: .date)
.font(.subheadline)
.foregroundStyle(.secondary)
.textCase(.uppercase)
Spacer()
}
}
.padding(.horizontal)
.padding(.vertical, 12)
} content: {
LazyVStack(spacing: 16) {
ForEach(featuredApps) { app in
AppCard(app: app)
}
}
.padding()
}
.background(Color(.systemBackground))GeometryReaderPreferenceKeyStickyBlurHeader {
VStack(alignment: .leading, spacing: 4) {
Text("Title").font(.headline)
if showsSubtitle {
Text("Subtitle").font(.subheadline).foregroundStyle(.secondary)
}
}
.padding()
// Header auto-adjusts when showsSubtitle toggles
} content: {
contentList
}
.background(Color(.systemBackground))GeometryReaderPreferenceKeyStickyBlurHeader {
VStack(alignment: .leading, spacing: 4) {
Text("Title").font(.headline)
if showsSubtitle {
Text("Subtitle").font(.subheadline).foregroundStyle(.secondary)
}
}
.padding()
// 当showsSubtitle切换时,头部会自动调整
} content: {
contentList
}
.background(Color(.systemBackground))ZStack| Layer | Component | Purpose |
|---|---|---|
| Back | | Content scrolls freely, never clipped |
| Middle | | Progressive blur + adaptive tint |
| Front | Your header view | Floats above blur, transparent background |
ZStack| 层级 | 组件 | 用途 |
|---|---|---|
| 底层 | | 内容自由滚动,永不被裁剪 |
| 中层 | | 渐进式模糊 + 自适应色调 |
| 顶层 | 你的头部视图 | 悬浮在模糊层上方,背景透明 |
// WRONG — hides the blur effect
StickyBlurHeader {
Text("Header")
.background(Color.white) // ❌ Breaks the blur
}
// CORRECT — no background on header views
StickyBlurHeader {
Text("Header") // ✅ Transparent, blur shows through
}// 错误 — 会遮挡模糊效果
StickyBlurHeader {
Text("Header")
.background(Color.white) // ❌ 破坏模糊效果
}
// 正确 — 头部视图不设置背景
StickyBlurHeader {
Text("Header") // ✅ 透明,模糊效果可穿透
}// WRONG
StickyBlurHeader { ... } content: {
VStack { ... }
.clipped() // ❌ Content becomes invisible under header
}
// CORRECT — let content remain visible under blur
StickyBlurHeader { ... } content: {
VStack { ... } // ✅ No clipping
}// 错误
StickyBlurHeader { ... } content: {
VStack { ... }
.clipped() // ❌ 内容在头部下方会消失
}
// 正确 — 让内容在模糊层下方保持可见
StickyBlurHeader { ... } content: {
VStack { ... } // ✅ 不裁剪
}StickyBlurHeader { ... } content: { ... }
.background(Color(.systemBackground)) // ✅ Required for tint to work correctlyStickyBlurHeader { ... } content: { ... }
.background(Color(.systemBackground)) // ✅ 色调正常工作的必要条件.background(...)StickyBlurHeader.background(...)StickyBlurHeader.clipped()ScrollViewStickyBlurHeader.clipped()ScrollViewStickyBlurHeaderGeometryReaderGeometryReader.background(Color(.systemBackground)).background(Color(.systemBackground)).safeAreaBar(edge: .top)ProgressiveBlurHeader.safeAreaBar(edge: .top)ProgressiveBlurHeader