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 数组