问题描述
我有 Core Text 的基本实现,可以在iOS上打印Hello World,它与UIKit完美结合。
import UIKit
import CoreText
class CTView: UIView {
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext() else { return }
// Flip the coordinate system
context.textMatrix = .identity
context.translateBy(x: 0,y: bounds.size.height)
context.scaleBy(x: 1.0,y: -1.0)
let path = CGMutablePath()
path.addRect(bounds)
let attrString = NSAttributedString(string: "Hello World")
let framesetter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)
let frame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,attrString.length),path,nil)
CTFrameDraw(frame,context)
}
}
我尝试通过使用UIViewRepresentable
来将此核心文本与SwiftUI而不是UIKit一起使用:
import SwiftUI
import CoreText
struct CTView: UIViewRepresentable {
func makeUIView(context: Context) -> UIView {
return UIView()
}
func updateUIView(_ uiView: UIView,context: Context) {
}
}
但是我无法弄清楚如何实现(或基本上覆盖)draw函数,因为我们在SwiftUI中使用结构而不是类。
除此之外,我们如何为macOS做同样的事情?
解决方法
只需将您以前的CTView
包装起来,就像
struct WrappedCTView: UIViewRepresentable {
func makeUIView(context: Context) -> CTView {
let view = CTView() // << here !!
view.isOpaque = false
return view
}
func updateUIView(_ uiView: CTView,context: Context) {}
}