
Analytics Dashboard
by dockui
A clean, card-based analytics dashboard with a time range selector, key metrics grid and progress bars for platform distribution.
- Platform
- SwiftUI
- Code
- Native Swift
- Format
- Screen
- Access
- Free
Code Snippet
import SwiftUI
import Charts
struct AnalyticsDashboardView: View {
// Sample data
@State private var selectedTimeRange = "Last 7 Days"
@State private var showingDatePicker = false
let timeRanges = ["Last 7 Days", "Last 30 Days", "Last 3 Months"]
// Dummy data for metrics
let metrics: [AnalyticsMetric] = [
AnalyticsMetric(title: "Active Users", value: "45.2K", trend: "+12%", isPositive: true),
AnalyticsMetric(title: "Revenue", value: "$28.5K", trend: "+8%", isPositive: true),
AnalyticsMetric(title: "Session Time", value: "24m", trend: "-5%", isPositive: false),
AnalyticsMetric(title: "Conversion", value: "3.8%", trend: "+2%", isPositive: true)
]
// Dummy data for charts
let userActivityData: [DataPoint] = [
DataPoint(date: "Mon", value: 2500),
DataPoint(date: "Tue", value: 3200),
DataPoint(date: "Wed", value: 2800),
DataPoint(date: "Thu", value: 3800),
DataPoint(date: "Fri", value: 4200),
DataPoint(date: "Sat", value: 3600),
DataPoint(date: "Sun", value: 3900)
]
var body: some View {
NavigationStack {
ScrollView {
VStack(spacing: 20) {
// Time range picker
timeRangeSelector
// Metrics grid
LazyVGrid(columns: [
GridItem(.flexible()),
GridItem(.flexible())
], spacing: 16) {
ForEach(metrics) { metric in
MetricCards(metric: metric)
}
}
.padding(.horizontal)
// Charts section
VStack(alignment: .leading, spacing: 20) {
Text("User Activity")
.font(.title2)
.bold()
.padding(.horizontal)
Chart {
ForEach(userActivityData) { point in
LineMark(
x: .value("Day", point.date),
y: .value("Users", point.value)
)
.foregroundStyle(Color.blue.gradient)
AreaMark(
x: .value("Day", point.date),
y: .value("Users", point.value)
)
.foregroundStyle(Color.blue.opacity(0.1))
}
}
.frame(height: 200)
.padding()
.background(Color(uiColor: .systemBackground))
.cornerRadius(12)
.shadow(radius: 2)
.padding(.horizontal)
}
// Platform distribution
PlatformDistributionView()
}
.padding(.vertical)
}
.navigationTitle("Analytics")
.background(Color(uiColor: .systemGroupedBackground))
}
}
private var timeRangeSelector: some View {
Menu {
ForEach(timeRanges, id: \.self) { range in
Button(action: {
selectedTimeRange = range
}) {
Text(range)
}
}
} label: {
HStack {
Text(selectedTimeRange)
.foregroundColor(.primary)
Image(systemName: "chevron.down")
.foregroundColor(.blue)
}
.padding()
.background(Color(uiColor: .systemBackground))
.cornerRadius(10)
}
}
}
struct MetricCards: View {
let metric: AnalyticsMetric
var body: some View {
VStack(alignment: .leading, spacing: 8) {
Text(metric.title)
.font(.subheadline)
.foregroundColor(.secondary)
HStack(alignment: .firstTextBaseline) {
Text(metric.value)
.font(.title2)
.bold()
Spacer()
Text(metric.trend)
.font(.footnote)
.foregroundColor(metric.isPositive ? .green : .red)
.padding(.horizontal, 8)
.padding(.vertical, 4)
.background(
(metric.isPositive ? Color.green : Color.red)
.opacity(0.1)
)
.cornerRadius(8)
}
}
.padding()
.background(Color(uiColor: .systemBackground))
.cornerRadius(12)
.shadow(radius: 2)
}
}
struct PlatformDistributionView: View {
let platforms = [
("iOS", 65.0, Color.blue),
("Android", 30.0, Color.green),
("Web", 5.0, Color.orange)
]
var body: some View {
VStack(alignment: .leading, spacing: 20) {
Text("Platform Distribution")
.font(.title2)
.bold()
.padding(.horizontal)
VStack(spacing: 12) {
ForEach(platforms, id: \.0) { platform, percentage, color in
HStack {
Text(platform)
.frame(width: 80, alignment: .leading)
GeometryReader { geometry in
ZStack(alignment: .leading) {
Rectangle()
.fill(Color(uiColor: .systemGray5))
Rectangle()
.fill(color)
.frame(width: geometry.size.width * percentage / 100)
}
}
.frame(height: 8)
.cornerRadius(4)
Text("\(Int(percentage))%")
.frame(width: 50)
}
}
}
.padding()
.background(Color(uiColor: .systemBackground))
.cornerRadius(12)
.shadow(radius: 2)
.padding(.horizontal)
}
}
}
// Models
struct AnalyticsMetric: Identifiable {
let id = UUID()
let title: String
let value: String
let trend: String
let isPositive: Bool
}
struct DataPoint: Identifiable {
let id = UUID()
let date: String
let value: Double
}More Templates
View All TemplatesSimilar Blogs
View All Articles
How to Translate Xcode String Catalogs with AI
Learn how to efficiently translate Xcode string catalogs using AI fast, streamlining localization for your iOS and SwiftUI applications.
by dockui
May 4
How to optimize your SwiftUI app in 2026
Discover top strategies to optimize your SwiftUI app in 2026, enhancing performance, responsiveness, and maintainability with modern concurrency.
by dockui
Apr 29
SwiftUI: iOS Confirmation Alert (Confirm + Cancel)
SwiftUI iOS confirmation alert with Confirm and Cancel buttons. Beginners guide to building safe actions, destructive deletes, and commit dialogs.
by dockui
Nov 11
SwiftUI: IOS Haptic Feedback Guide 2026
Add click to vibrate haptic feedback in SwiftUI. Full guide to UIImpactFeedbackgenerator, success, error, selection, and tap vibration patterns with code.
by dockui
Nov 11Code copied to clipboard!