Glassmorphism mit Unschärfeeffekten und Benachrichtigungen im Dynamic-Island-Stil
Dieses Beispiel demonstriert Glassmorphism mit Unschärfeeffekten und Benachrichtigungen im Dynamic-Island-Stil in SwiftUI.
import SwiftUI
struct ContentView: View {
@State private var showNotification = false
@State private var notificationOffset: CGFloat = -100
@Environment(\.colorScheme) var colorScheme
var body: some View {
ZStack {
// Background gradient
LinearGradient(
gradient: Gradient(colors: [Color.blue.opacity(0.6), Color.purple.opacity(0.6)]),
startPoint: .topLeading,
endPoint: .bottomTrailing
)
.ignoresSafeArea()
VStack(spacing: 20) {
// Glassmorphic Card
VStack(alignment: .leading, spacing: 16) {
HStack {
Image(systemName: "creditcard.fill")
.font(.title)
.foregroundStyle(.purple, .blue.opacity(0.8))
Spacer()
Text("Premium")
.font(.caption)
.fontWeight(.bold)
.padding(.horizontal, 10)
.padding(.vertical, 5)
.background(
Capsule()
.fill(.ultraThinMaterial)
)
}
Text("Modern SwiftUI Design")
.font(.title2)
.fontWeight(.bold)
Text("This example showcases glassmorphism with blur effects and dynamic island-style notifications in SwiftUI.")
.font(.subheadline)
.opacity(0.7)
Divider()
.background(Color.white.opacity(0.5))
Button(action: {
withAnimation(.spring()) {
showNotification = true
notificationOffset = 0
// Auto-dismiss notification
DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {
withAnimation(.spring()) {
notificationOffset = -100
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
showNotification = false
}
}
}
}
}) {
Text("Trigger Notification")
.fontWeight(.semibold)
.foregroundColor(.white)
.frame(maxWidth: .infinity)
.padding()
.background(
LinearGradient(
gradient: Gradient(colors: [Color.blue, Color.purple]),
startPoint: .leading,
endPoint: .trailing
)
)
.clipShape(RoundedRectangle(cornerRadius: 16, style: .continuous))
}
}
.padding(20)
.frame(width: 340)
.background(
// Glassmorphic effect
RoundedRectangle(cornerRadius: 24, style: .continuous)
.fill(colorScheme == .dark ?
.ultraThinMaterial : .regularMaterial)
.shadow(color: Color.black.opacity(0.15), radius: 20, x: 0, y: 10)
)
// Design system information
VStack(alignment: .leading, spacing: 4) {
Text("Design Features:")
.font(.caption)
.fontWeight(.bold)
HStack(spacing: 8) {
DesignFeatureTag(text: "Glassmorphism", icon: "circle.hexagongrid.fill")
DesignFeatureTag(text: "Dynamic Island", icon: "rectangle.inset.filled")
}
}
.frame(width: 340, alignment: .leading)
.padding(.top, 8)
}
// Dynamic Island style notification
if showNotification {
VStack {
HStack(spacing: 12) {
Image(systemName: "checkmark.seal.fill")
.font(.title3)
.foregroundColor(.green)
VStack(alignment: .leading) {
Text("Success")
.font(.callout)
.fontWeight(.semibold)
Text("Your action was completed")
.font(.caption)
.opacity(0.7)
}
Spacer()
}
.padding(.horizontal, 16)
.padding(.vertical, 12)
.background(
RoundedRectangle(cornerRadius: 24, style: .continuous)
.fill(.ultraThinMaterial)
.shadow(color: Color.black.opacity(0.2), radius: 10, x: 0, y: 5)
)
.padding(.horizontal)
.offset(y: notificationOffset)
Spacer()
}
.padding(.top, 5)
}
}
}
}
// Reusable component for design feature tags
struct DesignFeatureTag: View {
let text: String
let icon: String
var body: some View {
HStack(spacing: 4) {
Image(systemName: icon)
.font(.caption2)
Text(text)
.font(.caption2)
.fontWeight(.medium)
}
.padding(.horizontal, 8)
.padding(.vertical, 4)
.background(
Capsule()
.fill(.ultraThinMaterial)
)
}
}