Вот мое решение, но это очень много взлома, и я не знаю, одобрит ли это Apple. Так что рассмотрите этот ответ для «образовательных целей», я думаю.
Концепция
Основная идея состоит в том, чтобы изменить файл SVG, экспортируемый приложением SF Symbols, чтобы он содержал только один экземпляр выбранного символа вместо полного шаблона и использование инфраструктуры SVGKit для его отображения через объект NSViewRepresentable
.
Export
Использование приложения SF Symbols на вашем Ma c и выберите символ, который вы хотите использовать, а затем выполните «Экспорт шаблона пользовательского символа».
Изменение
Откройте экспортированный файл SVG в текстовом редакторе, например Sublime Text или CotEditor.
Удалите все в файле, кроме заголовка и поля «Символы», которое должно содержать только вариант символа, который вы хотите использовать. Затем измените размер визуализированного холста и также правильно выровняйте символ.
Например, если вы хотите использовать версию "плюс" в "Regular-L", ваш окончательный вариант "plus.svg" Файл должен быть таким:
<?xml version="1.0" encoding="UTF-8"?>
<!--Generator: Apple Native CoreSVG 123-->
<!DOCTYPE svg
PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128">
<!--glyph: "uni10017C.medium", point size: 100.000000, font version: "Version 15.0d7e11", template writer version: "5"-->
<g id="Symbols">
<g id="Regular-L" transform="matrix(1 0 0 1 0 100)">
<path d="M 67.4316 17.3828 C 70.0684 17.3828 72.2168 15.2832 72.2168 12.7441 L 72.2168 -30.3711 L 114.062 -30.3711 C 116.65 -30.3711 118.848 -32.5684 118.848 -35.1562 C 118.848 -37.793 116.65 -39.9414 114.062 -39.9414 L 72.2168 -39.9414 L 72.2168 -83.1055 C 72.2168 -85.6445 70.0684 -87.7441 67.4316 -87.7441 C 64.8438 -87.7441 62.6953 -85.6445 62.6953 -83.1055 L 62.6953 -39.9414 L 20.8496 -39.9414 C 18.2617 -39.9414 16.0645 -37.793 16.0645 -35.1562 C 16.0645 -32.5684 18.2617 -30.3711 20.8496 -30.3711 L 62.6953 -30.3711 L 62.6953 12.7441 C 62.6953 15.2832 64.8438 17.3828 67.4316 17.3828 Z"/>
</g>
</g>
</svg>
Подводя итог:
- Сохранить заголовок
- Оставить поле
id="Symbols"
- В поле Символы, оставьте только одну категорию, в моем примере
id="Regular-L"
- Измените размер в заголовке, в моем примере
width="128" height="128"
- Выровняйте символ, изменив два последних параметра поле преобразования, в моем примере
transform="matrix(1 0 0 1 0 100)"
(x 0 и y 100)
Установить SVGKit
Создайте представление
Добавьте измененный plus.svg
файл в ваш проект (не в каталоге ресурсов, а в самом проекте)
Создайте структуру NSViewRepresentable
следующим образом:
import SVGKit
struct IconView: NSViewRepresentable {
let name: String
func makeNSView(context: Context) -> SVGKFastImageView {
let img = SVGKImage(named: name)!
return SVGKFastImageView(svgkImage: img)!
}
func updateNSView(_ nsView: SVGKFastImageView, context: Context) {
// not implemented
}
}
Используйте view
Затем используйте его в ContentView (дайте ему рамку, чтобы он не заполнил все окно), например:
struct ContentView: View {
var body: some View {
VStack {
IconView(name: "plus")
.frame(width: 200, height: 200, alignment: .center)
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
}