【问题标题】:SwiftUI/UIKit How to convert SwiftUI Font to UIKit UIFont?SwiftUI/UIKit 如何将 SwiftUI 字体转换为 UIKit UIFont?
【发布时间】:2020-10-15 09:51:26
【问题描述】:

由于 SwiftUI Text 中的一些限制。我必须改用 UIText。

在 UIViewRepresentable 中,

    func makeUIView(context: Context) -> UITextView {
        let vw = UITextView()
        let env = context.environment
        
        // UIFont?     Font?
        vw.font = env.font

        ...
    }

我想使用 SwiftUI EnvironmentValues 初始化 UIKit UILabel。

更具体地说,将 SwiftUI 字体分配给 UIKit UIFont。

问题是,如何将 Font 转换为 UIFont?

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    如果您需要共享相同的字体,则使用UIFont 作为模型属性,并在需要的地方在 SwiftUI 中转换,例如

    Text("Some text")
       .font(Font(uiFont as CTFont))
    

    【讨论】:

    • 我认为这是一个有效的解决方案,但是,如果我们走这条路,所有与 Font 相关的 SwiftUI EnvironmentValues 都应该手动覆盖。这样 SwiftUI 和 UIKit 部分都使用了统一的 UIFont。
    • 有点跑题了,你认为有一种方法可以在 SwiftUI 中使用“属性文本”或类似的东西而不通过 UIKit/Appkit 吗?
    • 如果属性文本不是很复杂,那么考虑stackoverflow.com/a/59531328/12299030
    • 没有 UIKit,如果我们走 Text + Text 路线,我们需要一个构建器来解析属性文本并将其构建到 Text.someModifers + Text... 中。也许目前 UIKit 是最好的选择:-)。
    • @Asperi 该解决方案在纸面上有效,但在这种情况下,Font 停止针对内容大小类别进行缩放,即使我将动态 .preferredFont(forTextStyle: .headline) 作为初始 UIFont 传递也是如此。对这个用例有什么建议吗?
    【解决方案2】:

    创建扩展:

    extension Font {
      init(_ uiFont: UIFont) {
        self = Font(uiFont as CTFont)
      }
    }
    

    如下使用:

    Text("Some text")
       .font(Font(yourUIFont))
    

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2021-09-06
      • 2021-05-18
      • 2022-01-22
      相关资源
      最近更新 更多