Swift Package中的资产符号生成

js4nwp54  于 2023-08-02  发布在  Swift
关注(0)|答案(1)|浏览(82)

我在SwiftUI项目中有一个Swift包,其中包含UI组件的样式。此外,此包还包括一个资源文件夹,其中包含可用于样式化的资源。我可以通过图像的名称获取图像,但我想知道是否可以使用枚举访问图像。因为Xcode 15会自动为资产生成符号。
下面的例子可以解释我的意思:

public struct CheckboxToggleStyle: ToggleStyle {
@Binding var color: Color

let checked = Image("checkbox-checked", bundle: .module) // ✅ works
let unchecked = Image("checkbox-unchecked", bundle: .module) // ✅ works
let checked = Image(.checkboxChecked) // ❌ failed
let unchecked = Image(.checkboxUnchecked) // ❌ failed

public func makeBody(configuration: Configuration) -> some View {
    (configuration.isOn ? checked : unchecked)
        .renderingMode(.template)
        .foregroundColor(color)
        .onTapGesture {
            withAnimation {
                configuration.isOn.toggle()
            }
        }
}

字符串
}

goqiplq2

goqiplq21#

我是这么做的如果你想了解更多细节,请查看我的软件包Iconoir,地址为https://github.com/iconoir-icons/iconoir-swift/tree/main
最后,您需要做的是定义一个名称不限的枚举,然后将所有相应的Symbol Names作为字符串赋给枚举,然后使用一个实用方法或枚举计算属性。从理论上讲,你也可以写一个脚本,它会自动获取所有的符号名并为你生成枚举,这就是我最终对Iconoir所做的,因为我不可能手动输入1000多个枚举声明。

枚举

public enum Iconoir: String, CaseIterable {
    case bell = "bell"

字符串

实现

@available(iOS 13, macOS 10.15, *)
public extension Iconoir {
    /// Returns a SwiftUI Image of the Iconoir icon.
    var asImage: Image {
        return Image(self.rawValue, bundle: Bundle.module)
            .renderingMode(.template)
    }
    
    
    /// Returns an image, from the Iconoir bundle, if there is a matching key.
    /// - Parameter string: key that matches iconoir icon.
    /// - Returns: SwiftUI Image
    static func image(from string: String) -> Image {
        return Image(string, bundle: Bundle.module)
            .renderingMode(.template)
    }
}
#endif

用法

Iconoir.bell.asImage
Iconoir.bell.asUIImage
Iconoir.image(from: "bell")

其他想法

如果您没有太多的图像,而不是像我所做的那样创建一个扩展,您可以简单地添加一个计算属性来完成类似的事情,到您的枚举。

var image: Image { 
    //... 
}

相关问题