SwiftUI/UIKit 如何将 SwiftUI 字体转换为 UIKit UIFont?

Posted

技术标签:

【中文标题】SwiftUI/UIKit 如何将 SwiftUI 字体转换为 UIKit UIFont?【英文标题】:SwiftUI/UIKit How to convert SwiftUI Font to 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?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我认为这是一个有效的解决方案,但是,如果我们走这条路,所有与 Font 相关的 SwiftUI EnvironmentValues 都应该手动覆盖。这样 SwiftUI 和 UIKit 部分都使用了统一的 UIFont。 有点跑题了,你认为有一种方法可以在 SwiftUI 中使用“属性文本”或类似的东西而不通过 UIKit/Appkit 吗? 如果属性文本不是很复杂,那么考虑***.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))

【讨论】:

以上是关于SwiftUI/UIKit 如何将 SwiftUI 字体转换为 UIKit UIFont?的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 在 SwiftUI 中滑动 1 次后停止工作

支持不同 SwiftUI 视图类型的 UIHostingController 数组

如何使用 SwiftUI 将数组绑定到列表

如何将 swiftUI 按钮连接到 NSView 操作?

如何将 UISearchController 与 SwiftUI 集成

如何指定将保存 SwiftUI 自定义视图的数组的类型信息