Генерация символов актива в пакете Swift
В моем проекте SwiftUI есть пакет Swift, который включает стили для компонентов пользовательского интерфейса. Кроме того, этот пакет включает папку ресурсов, содержащую ресурсы, которые можно использовать при стилизации. Я могу получить изображение по его имени, но мне хотелось бы знать, могу ли я получить доступ к изображениям с помощью перечислений. Потому что 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()
}
}
}
}
2 ответа
Правильный синтаксис:Image(resource: .checkboxChecked)
(нетImage(.checkboxChecked)
)
Вот как я это делаю. Если вам нужна более подробная информация, посмотрите мой пакет по адресу 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 {
//...
}