import SwiftUI import QRCode // MARK: - 二维码颜色 enum QRCodeColor: String, CaseIterable, Hashable { case black = "black" case white = "white" case red = "red" case blue = "blue" case green = "green" case yellow = "yellow" case purple = "purple" case orange = "orange" case pink = "pink" case cyan = "cyan" case magenta = "magenta" case brown = "brown" case gray = "gray" case navy = "navy" case teal = "teal" case indigo = "indigo" case lime = "lime" case maroon = "maroon" case olive = "olive" case silver = "silver" var color: Color { switch self { case .black: return Color(red: 0, green: 0, blue: 0) case .white: return Color(red: 1, green: 1, blue: 1) case .red: return Color(red: 1, green: 0, blue: 0) case .blue: return Color(red: 0, green: 0, blue: 1) case .green: return Color(red: 0, green: 1, blue: 0) case .yellow: return Color(red: 1, green: 1, blue: 0) case .purple: return Color(red: 0.5, green: 0, blue: 0.5) case .orange: return Color(red: 1, green: 0.5, blue: 0) case .pink: return Color(red: 1, green: 0.75, blue: 0.8) case .cyan: return Color(red: 0, green: 1, blue: 1) case .magenta: return Color(red: 1, green: 0, blue: 1) case .brown: return Color(red: 0.6, green: 0.4, blue: 0.2) case .gray: return Color(red: 0.5, green: 0.5, blue: 0.5) case .navy: return Color(red: 0, green: 0, blue: 0.5) case .teal: return Color(red: 0, green: 0.5, blue: 0.5) case .indigo: return Color(red: 0.3, green: 0, blue: 0.5) case .lime: return Color(red: 0.5, green: 1, blue: 0) case .maroon: return Color(red: 0.5, green: 0, blue: 0) case .olive: return Color(red: 0.5, green: 0.5, blue: 0) case .silver: return Color(red: 0.75, green: 0.75, blue: 0.75) } } var cgColor: CGColor { return color.cgColor! } static var foregroundColors: [QRCodeColor] { return [.black, .red, .blue, .green, .purple, .orange, .pink, .brown, .navy, .teal, .indigo, .maroon, .olive] } static var backgroundColors: [QRCodeColor] { return [.white, .gray, .silver, .cyan, .yellow, .lime] } } // MARK: - 二维码点类型 enum QRCodeDotType: String, CaseIterable, Hashable { case square = "data_square" case circle = "data_circle" case roundedRect = "data_roundedRect" case squircle = "data_squircle" case diamond = "data_diamond" case hexagon = "data_hexagon" case star = "data_star" case heart = "data_heart" case flower = "data_flower" case gear = "data_gear" case abstract = "data_abstract" case arrow = "data_arrow" case blob = "data_blob" case circuit = "data_circuit" case crosshatch = "data_crosshatch" case crt = "data_crt" case curvePixel = "data_curvePixel" case diagonal = "data_diagonal" case diagonalStripes = "data_diagonalStripes" case donut = "data_donut" case dripHorizontal = "data_dripHorizontal" case dripVertical = "data_dripVertical" case flame = "data_flame" case grid2x2 = "data_grid2x2" case grid3x3 = "data_grid3x3" case grid4x4 = "data_grid4x4" case horizontal = "data_horizontal" case koala = "data_koala" case pointy = "data_pointy" case razor = "data_razor" case roundedEndIndent = "data_roundedEndIndent" case roundedPath = "data_roundedPath" case roundedTriangle = "data_roundedTriangle" case sharp = "data_sharp" case shiny = "data_shiny" case spikyCircle = "data_spikyCircle" case stitch = "data_stitch" case vertical = "data_vertical" case vortex = "data_vortex" case wave = "data_wave" case wex = "data_wex" var thumbnailName: String { return rawValue } var displayName: String { switch self { case .square: return "square".localized case .circle: return "circle".localized case .roundedRect: return "rounded_rect".localized case .squircle: return "squircle".localized case .diamond: return "diamond".localized case .hexagon: return "hexagon".localized case .star: return "star".localized case .heart: return "heart".localized case .flower: return "flower".localized case .gear: return "gear".localized case .abstract: return "abstract".localized case .arrow: return "arrow".localized case .blob: return "blob".localized case .circuit: return "circuit".localized case .crosshatch: return "crosshatch".localized case .crt: return "CRT" case .curvePixel: return "curve_pixel".localized case .diagonal: return "diagonal".localized case .diagonalStripes: return "diagonal_stripes".localized case .donut: return "donut".localized case .dripHorizontal: return "drip_horizontal".localized case .dripVertical: return "drip_vertical".localized case .flame: return "flame".localized case .grid2x2: return "grid_2x2".localized case .grid3x3: return "grid_3x3".localized case .grid4x4: return "grid_4x4".localized case .horizontal: return "horizontal".localized case .koala: return "koala".localized case .pointy: return "pointy".localized case .razor: return "razor".localized case .roundedEndIndent: return "rounded_end_indent".localized case .roundedPath: return "rounded_path".localized case .roundedTriangle: return "rounded_triangle".localized case .sharp: return "sharp".localized case .shiny: return "shiny".localized case .spikyCircle: return "spiky_circle".localized case .stitch: return "stitch".localized case .vertical: return "vertical".localized case .vortex: return "vortex".localized case .wave: return "wave".localized case .wex: return "wex".localized } } var pixelShape: QRCodePixelShapeGenerator { switch self { case .square: return QRCode.PixelShape.Square() case .circle: return QRCode.PixelShape.Circle() case .roundedRect: return QRCode.PixelShape.RoundedRect() case .squircle: return QRCode.PixelShape.Squircle() case .diamond: return QRCode.PixelShape.Diamond() case .hexagon: return QRCode.PixelShape.Hexagon() case .star: return QRCode.PixelShape.Star() case .heart: return QRCode.PixelShape.Heart() case .flower: return QRCode.PixelShape.Flower() case .gear: return QRCode.PixelShape.Gear() case .abstract: return QRCode.PixelShape.Abstract() case .arrow: return QRCode.PixelShape.Arrow() case .blob: return QRCode.PixelShape.Blob() case .circuit: return QRCode.PixelShape.Circuit() case .crosshatch: return QRCode.PixelShape.Crosshatch() case .crt: return QRCode.PixelShape.CRT() case .curvePixel: return QRCode.PixelShape.CurvePixel() case .diagonal: return QRCode.PixelShape.Diagonal() case .diagonalStripes: return QRCode.PixelShape.DiagonalStripes() case .donut: return QRCode.PixelShape.Donut() case .dripHorizontal: return QRCode.PixelShape.DripHorizontal() case .dripVertical: return QRCode.PixelShape.DripVertical() case .flame: return QRCode.PixelShape.Flame() case .grid2x2: return QRCode.PixelShape.Grid2x2() case .grid3x3: return QRCode.PixelShape.Grid3x3() case .grid4x4: return QRCode.PixelShape.Grid4x4() case .horizontal: return QRCode.PixelShape.Horizontal() case .koala: return QRCode.PixelShape.Koala() case .pointy: return QRCode.PixelShape.Pointy() case .razor: return QRCode.PixelShape.Razor() case .roundedEndIndent: return QRCode.PixelShape.RoundedEndIndent() case .roundedPath: return QRCode.PixelShape.RoundedPath() case .roundedTriangle: return QRCode.PixelShape.RoundedTriangle() case .sharp: return QRCode.PixelShape.Sharp() case .shiny: return QRCode.PixelShape.Shiny() case .spikyCircle: return QRCode.PixelShape.SpikyCircle() case .stitch: return QRCode.PixelShape.Stitch() case .vertical: return QRCode.PixelShape.Vertical() case .vortex: return QRCode.PixelShape.Vortex() case .wave: return QRCode.PixelShape.Wave() case .wex: return QRCode.PixelShape.Wex() } } } // MARK: - 二维码眼睛类型 enum QRCodeEyeType: String, CaseIterable, Hashable { case square = "eye_square" case circle = "eye_circle" case roundedRect = "eye_roundedRect" case squircle = "eye_squircle" case arc = "eye_arc" case barsHorizontal = "eye_barsHorizontal" case barsVertical = "eye_barsVertical" case cloud = "eye_cloud" case cloudCircle = "eye_cloudCircle" case corneredPixels = "eye_corneredPixels" case crt = "eye_crt" case diagonalStripes = "eye_diagonalStripes" case dotDragHorizontal = "eye_dotDragHorizontal" case dotDragVertical = "eye_dotDragVertical" case edges = "eye_edges" case explode = "eye_explode" case eye = "eye_eye" case fabricScissors = "eye_fabricScissors" case fireball = "eye_fireball" case flame = "eye_flame" case headlight = "eye_headlight" case holePunch = "eye_holePunch" case leaf = "eye_leaf" case peacock = "eye_peacock" case pinch = "eye_pinch" case pixels = "eye_pixels" case roundedOuter = "eye_roundedOuter" case roundedPointingIn = "eye_roundedPointingIn" case roundedPointingOut = "eye_roundedPointingOut" case shield = "eye_shield" case spikyCircle = "eye_spikyCircle" case squarePeg = "eye_squarePeg" case surroundingBars = "eye_surroundingBars" case teardrop = "eye_teardrop" case ufo = "eye_ufo" case ufoRounded = "eye_ufoRounded" case usePixelShape = "eye_usePixelShape" var thumbnailName: String { return rawValue } var displayName: String { switch self { case .square: return "square".localized case .circle: return "circle".localized case .roundedRect: return "rounded_rect".localized case .squircle: return "squircle".localized case .arc: return "arc".localized case .barsHorizontal: return "bars_horizontal".localized case .barsVertical: return "bars_vertical".localized case .cloud: return "cloud".localized case .cloudCircle: return "cloud_circle".localized case .corneredPixels: return "cornered_pixels".localized case .crt: return "CRT" case .diagonalStripes: return "diagonal_stripes".localized case .dotDragHorizontal: return "dot_drag_horizontal".localized case .dotDragVertical: return "dot_drag_vertical".localized case .edges: return "edges".localized case .explode: return "explode".localized case .eye: return "eye".localized case .fabricScissors: return "fabric_scissors".localized case .fireball: return "fireball".localized case .flame: return "flame".localized case .headlight: return "headlight".localized case .holePunch: return "hole_punch".localized case .leaf: return "leaf".localized case .peacock: return "peacock".localized case .pinch: return "pinch".localized case .pixels: return "pixels".localized case .roundedOuter: return "rounded_outer".localized case .roundedPointingIn: return "rounded_pointing_in".localized case .roundedPointingOut: return "rounded_pointing_out".localized case .shield: return "shield".localized case .spikyCircle: return "spiky_circle".localized case .squarePeg: return "square_peg".localized case .surroundingBars: return "surrounding_bars".localized case .teardrop: return "teardrop".localized case .ufo: return "ufo".localized case .ufoRounded: return "ufo_rounded".localized case .usePixelShape: return "use_pixel_shape".localized } } var eyeShape: QRCodeEyeShapeGenerator { switch self { case .square: return QRCode.EyeShape.Square() case .circle: return QRCode.EyeShape.Circle() case .roundedRect: return QRCode.EyeShape.RoundedRect() case .squircle: return QRCode.EyeShape.Squircle() case .arc: return QRCode.EyeShape.Arc() case .barsHorizontal: return QRCode.EyeShape.BarsHorizontal() case .barsVertical: return QRCode.EyeShape.BarsVertical() case .cloud: return QRCode.EyeShape.Cloud() case .cloudCircle: return QRCode.EyeShape.CloudCircle() case .corneredPixels: return QRCode.EyeShape.CorneredPixels() case .crt: return QRCode.EyeShape.CRT() case .diagonalStripes: return QRCode.EyeShape.DiagonalStripes() case .dotDragHorizontal: return QRCode.EyeShape.DotDragHorizontal() case .dotDragVertical: return QRCode.EyeShape.DotDragVertical() case .edges: return QRCode.EyeShape.Edges() case .explode: return QRCode.EyeShape.Explode() case .eye: return QRCode.EyeShape.Eye() case .fabricScissors: return QRCode.EyeShape.FabricScissors() case .fireball: return QRCode.EyeShape.Fireball() case .flame: return QRCode.EyeShape.Flame() case .headlight: return QRCode.EyeShape.Headlight() case .holePunch: return QRCode.EyeShape.HolePunch() case .leaf: return QRCode.EyeShape.Leaf() case .peacock: return QRCode.EyeShape.Peacock() case .pinch: return QRCode.EyeShape.Pinch() case .pixels: return QRCode.EyeShape.Pixels() case .roundedOuter: return QRCode.EyeShape.RoundedOuter() case .roundedPointingIn: return QRCode.EyeShape.RoundedPointingIn() case .roundedPointingOut: return QRCode.EyeShape.RoundedPointingOut() case .shield: return QRCode.EyeShape.Shield() case .spikyCircle: return QRCode.EyeShape.SpikyCircle() case .squarePeg: return QRCode.EyeShape.SquarePeg() case .surroundingBars: return QRCode.EyeShape.SurroundingBars() case .teardrop: return QRCode.EyeShape.Teardrop() case .ufo: return QRCode.EyeShape.UFO() case .ufoRounded: return QRCode.EyeShape.UFORounded() case .usePixelShape: return QRCode.EyeShape.UsePixelShape() } } } // MARK: - 二维码Logo enum QRCodeLogo: String, CaseIterable, Hashable { case scanMe = "scanMe" case gmail = "gmail" case paypal = "paypal" case googlePlaystore = "googlePlaystore" case spotify = "spotify" case telegram = "telegram" case whatsApp = "whatsApp" case linkedIn = "linkedIn" case tikTok = "tikTok" case snapchat = "snapchat" case youtube = "youtube" case x = "x" case pinterest = "pinterest" case instagram = "instagram" case facebook = "facebook" var thumbnailName: String { return rawValue } var displayName: String { switch self { case .scanMe: return "scan_me".localized case .gmail: return "gmail".localized case .paypal: return "paypal".localized case .googlePlaystore: return "google_playstore".localized case .spotify: return "spotify".localized case .telegram: return "telegram".localized case .whatsApp: return "whats_app".localized case .linkedIn: return "linked_in".localized case .tikTok: return "tik_tok".localized case .snapchat: return "snapchat".localized case .youtube: return "youtube".localized case .x: return "x".localized case .pinterest: return "pinterest".localized case .instagram: return "instagram".localized case .facebook: return "facebook".localized } } var image: UIImage? { // 方法1: 尝试从Bundle中直接加载 if let image = UIImage(named: rawValue) { return image } // 方法2: 尝试从logos子目录加载 if let image = UIImage(named: "logos/\(rawValue)") { return image } // 方法3: 尝试从Resources/logos路径加载 if let path = Bundle.main.path(forResource: rawValue, ofType: "png", inDirectory: "Resources/logos") { return UIImage(contentsOfFile: path) } // 方法4: 尝试从Bundle的Resources目录加载 if let bundlePath = Bundle.main.path(forResource: "Resources", ofType: nil), let imagePath = Bundle.main.path(forResource: rawValue, ofType: "png", inDirectory: "logos") { return UIImage(contentsOfFile: imagePath) } // 方法5: 尝试从Assets.xcassets加载 if let image = UIImage(named: rawValue, in: Bundle.main, with: nil) { return image } return nil } }