Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davidsteppenbeck/19b3bdb8b4425f3e506e1fa45657ba6c to your computer and use it in GitHub Desktop.
Save davidsteppenbeck/19b3bdb8b4425f3e506e1fa45657ba6c to your computer and use it in GitHub Desktop.
import SwiftUI
import WidgetKit
enum WidgetPreviewProviderMode: CaseIterable {
/// Use for a system small widget preview.
case small
/// Use for a system medium widget preview.
case medium
/// Use for a system large widget preview.
case large
/// Use for a system extra large widget preview.
case extraLarge
}
extension WidgetPreviewProviderMode {
/// Provides the appropriate mode for the specified widget family.
static func mode(for widgetFamily: WidgetFamily) -> WidgetPreviewProviderMode {
switch widgetFamily {
case .systemSmall:
return .small
case .systemMedium:
return .medium
case .systemLarge:
return .large
case .systemExtraLarge:
return .extraLarge
@unknown default:
return .small
}
}
}
fileprivate struct WidgetPreviewProviderModifier: ViewModifier {
/// The widget preview provider modes to display.
let modes: [WidgetPreviewProviderMode]
func body(content: Content) -> some View {
Group {
if modes.contains(.small) {
content
.previewContext(WidgetPreviewContext(family: .systemSmall))
.previewDisplayName("Small")
}
if modes.contains(.medium) {
content
.previewContext(WidgetPreviewContext(family: .systemMedium))
.previewDisplayName("Medium")
}
if modes.contains(.large) {
content
.previewContext(WidgetPreviewContext(family: .systemLarge))
.previewDisplayName("Large")
}
if modes.contains(.extraLarge) {
content
.previewContext(WidgetPreviewContext(family: .systemExtraLarge))
.previewDisplayName("Extra Large")
}
}
}
}
extension View {
/// Creates a group of views with various widget contexts that are useful for widget previews.
///
/// - Parameters:
/// - modes: The widget preview provider modes to display, such as small, medium, large, and extra large.
func makeForWidgetPreviewProvider(_ modes: [WidgetPreviewProviderMode] = WidgetPreviewProviderMode.allCases) -> some View {
modifier(WidgetPreviewProviderModifier(modes: modes))
}
/// Creates a group of views with various widget contexts that are useful for widget previews.
///
/// - Parameters:
/// - mode: The widget preview provider mode to display, such as small, medium, large, or extra large.
func makeForWidgetPreviewProvider(_ mode: WidgetPreviewProviderMode) -> some View {
modifier(WidgetPreviewProviderModifier(modes: [mode]))
}
/// Creates a group of views with various environment settings that are useful for widget previews.
///
/// - Parameters:
/// - modes: The widget preview provider modes to be excluded from being displayed. All other modes will be displayed.
func makeForWidgetPreviewProvider(excluding modes: [WidgetPreviewProviderMode]) -> some View {
let included = WidgetPreviewProviderMode.allCases.filter { modes.contains($0) == false }
return modifier(WidgetPreviewProviderModifier(modes: included))
}
/// Creates a group of views with various environment settings that are useful for widget previews.
///
/// - Parameters:
/// - mode: The widget preview provider mode to be excluded from being displayed. All other modes will be displayed.
func makeForWidgetPreviewProvider(excluding mode: WidgetPreviewProviderMode) -> some View {
makeForWidgetPreviewProvider(excluding: [mode])
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment