// // EKAttributes+BackgroundStyle.swift // SwiftEntryKit // // Created by Daniel Huri on 4/21/18. // Copyright (c) 2018 huri000@gmail.com. All rights reserved. // import UIKit public extension EKAttributes { /** The background style property */ enum BackgroundStyle: Equatable { /** Blur style for light and dark modes */ public struct BlurStyle: Equatable { public static var extra: BlurStyle { return BlurStyle(light: .extraLight, dark: .dark) } public static var standard: BlurStyle { return BlurStyle(light: .light, dark: .dark) } @available(iOS 10.0, *) public static var prominent: BlurStyle { return BlurStyle(light: .prominent, dark: .prominent) } public static var dark: BlurStyle { return BlurStyle(light: .dark, dark: .dark) } let light: UIBlurEffect.Style let dark: UIBlurEffect.Style public init(style: UIBlurEffect.Style) { self.light = style self.dark = style } public init(light: UIBlurEffect.Style, dark: UIBlurEffect.Style) { self.light = light self.dark = dark } /** Computes a proper `UIBlurEffect.Style` instance */ public func blurStyle(for traits: UITraitCollection, mode: EKAttributes.DisplayMode) -> UIBlurEffect.Style { switch mode { case .inferred: if #available(iOS 13, *) { switch traits.userInterfaceStyle { case .light, .unspecified: return light case .dark: return dark @unknown default: return light } } else { return light } case .light: return light case .dark: return dark } } public func blurEffect(for traits: UITraitCollection, mode: EKAttributes.DisplayMode) -> UIBlurEffect { return UIBlurEffect(style: blurStyle(for: traits, mode: mode)) } } /** Gradient background style */ public struct Gradient { public var colors: [EKColor] public var startPoint: CGPoint public var endPoint: CGPoint public init(colors: [EKColor], startPoint: CGPoint, endPoint: CGPoint) { self.colors = colors self.startPoint = startPoint self.endPoint = endPoint } } /** Visual Effect (Blurred) background style */ case visualEffect(style: BlurStyle) /** Color background style */ case color(color: EKColor) /** Gradient background style */ case gradient(gradient: Gradient) /** Image background style */ case image(image: UIImage) /** Clear background style */ case clear /** == operator overload */ public static func == (lhs: EKAttributes.BackgroundStyle, rhs: EKAttributes.BackgroundStyle) -> Bool { switch (lhs, rhs) { case (visualEffect(style: let leftStyle), visualEffect(style: let rightStyle)): return leftStyle == rightStyle case (color(color: let leftColor), color(color: let rightColor)): return leftColor == rightColor case (image(image: let leftImage), image(image: let rightImage)): return leftImage == rightImage case (gradient(gradient: let leftGradient), gradient(gradient: let rightGradient)): for (leftColor, rightColor) in zip(leftGradient.colors, rightGradient.colors) { guard leftColor == rightColor else { return false } } return leftGradient.startPoint == rightGradient.startPoint && leftGradient.endPoint == rightGradient.endPoint case (clear, clear): return true default: return false } } } }