Skip to main content

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)
        )
    }
}