Как управлять изменением размера пользовательского импортированного значка и символа sf вместе в общем классе значков? - PullRequest
0 голосов
/ 23 апреля 2020

Я создаю класс значков библиотеки, который получает имя значка, флаг isSF (этот флаг будет указывать, является ли значок символом SF или нет) и размер значка. Мне нужно изменить размеры обеих иконок в соответствии с полученным значением размера. Проблема, с которой я здесь сталкиваюсь, заключается в том, что для символов SF мы можем изменить ее размер с помощью модификатора .font (.system (size: value)), но аналогичным образом изменить размер изображения (пользовательский значок).

Пожалуйста, помогите меня. Заранее спасибо

struct XIcon: View {
    var iconName: String
    var isSF: Bool? = true
    var size: CGFloat
    var body: some View {
        if isSF! {
            return AnyView( Image(systemName: "\(iconName)")
                .font(.system(size: size)))
        } else {
            return AnyView( Image(uiImage: UIImage(named: "\(iconName)")!).resizable())
        }
    }
}

Опять же, я знаю, когда мы указываем размер, выравнивание вектора выполняется, но для frame () это не так. Для масштабирования изображения есть scaleEffect (), но я не знаю, как масштабировать изображение, эквивалентное размеру, указанному для символа SF

1 Ответ

0 голосов
/ 23 апреля 2020

Здесь возможное решение. Протестировано с Xcode 11.4 / iOS 13.4

demo

Примечание: границы для лучшей видимости размера

struct XIcon: View {
    var iconName: String
    var isSF: Bool? = true
    var size: CGFloat

    var body: some View {
        var image: Image
        if isSF! {
            image = Image(systemName: "\(iconName)")
        } else {
            image = Image(uiImage: UIImage(named: "\(iconName)")!)
        }
        return image.resizable()
            .frame(width: size, height: size).aspectRatio(contentMode: .fill)
    }
}

struct TestXIcon: View {
    var body: some View {
        VStack {
            XIcon(iconName: "tv", size: 100)
                .border(Color.red)
            XIcon(iconName: "icon", isSF: false, size: 100)
                .border(Color.red)
        }
    }
}
...