【问题标题】:ViewModifier to change both font and trackingViewModifier 更改字体和跟踪
【发布时间】:2021-12-01 17:34:17
【问题描述】:

我正在尝试在 SwiftUI 中更改字体和文本的跟踪。 到目前为止,我已经为设置跟踪的 Text 创建了一个扩展。

extension Text {
    func setFont(as font: Font.MyFonts) -> Self {
        self.tracking(font.tracking)
    }
}

我还创建了一个视图修改器,可以从我的枚举中设置正确的字体

extension Text {
    func font(_ font: Font.MyFonts) -> some View {
        ModifiedContent(content: self, modifier: MyFont(font: font))
    }
}

struct MyFont: ViewModifier {
    let font: Font.MyFonts

    func body(content: Content) -> some View {
        content
            .font(.custom(font: font))
    }
}

static func custom(font: MyFonts) -> Font {
        return Font(font.font as CTFont)
    }

我似乎找不到任何方法来组合这些,因为视图修饰符返回some View,并且只能在Text 上设置跟踪。有没有什么巧妙的方法来组合这些,所以我只能设置视图修饰符?

字体的枚举如下所示

extension Font {
    enum MyFonts {
        case huge
        case large
        case medium

        /// Custom fonts according to design specs
        var font: UIFont {
            var font: UIFont?
            switch self {
            case .huge: font = UIFont(name: AppFontName.book, size: 40)
            case .large: font = UIFont(name: AppFontName.book, size: 28
            case .medium: font = UIFont(name: AppFontName.book_cursive, size: 18)
            }
            return font ?? UIFont.systemFont(ofSize: 16)
        }

        var tracking: Double {
            switch self {
            case .huge:
                return -0.25
            default:
                return 0
            }
        }
    }

这是我正在使用的应用字体名称结构

public struct AppFontName {

    static let book = "Any custom font name"
    static let book_cursive = "any custom font name cursive"
}

【问题讨论】:

  • 你会提供 MyFont 来测试所有组件吗?
  • 我已经更新了我正在使用的扩展 :)

标签: swift swiftui fonts


【解决方案1】:

我仍然有错过.custom 的错误,但无论如何,您的代码的解决方案似乎是使用自己的Text.font 而不是View.font,比如

extension Text {
//    func font(_ font: Font.MyFonts) -> some View {
//        ModifiedContent(content: self, modifier: MyFont(font: font))
//    }

    func font(_ font: Font.MyFonts) -> Self {
        self.font(Font.custom(font: font))
    }
}

【讨论】:

  • 啊,我也错过了...自定义只返回一个字体return Font(font.font as CTFont) - 所以它没有任何魔力...
  • 在这样的函数中,我还可以添加回调到 setFont() 函数...但是这将仅限于在 Text 上使用 - 我想我将不得不解决这个问题,不要将其用作一般 viewModifier
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多