Mac OS SwiftUI 创建带有一些文本的形状

问题描述 投票:0回答:1

我正在编写一个应用程序,它显示图像,然后在图像上绘制坐标网格,我想在其中放置网格关键点的一些文本标签。所以我写了一个形状来绘制带有标签的网格和字符串。网格绘制正确,但无法显示文本。这是示例代码。

struct CoordinatesGrid: Shape {
    
    func path(in rect: CGRect) -> Path {
        var path = Path()
        let dx: Double = rect.width / 10.0
        var dy: Double = rect.height / 10.0

        let font = NSFont(name: "Courier", size: 10.0)
        let fontAttributes = [NSAttributedString.Key.font: font]

        
        for i in 0 ... 10 {
            path.move(to: CGPoint(x: Double(i) * dx, y: 0.0))
            path.addLine(to: CGPoint(x: Double(i) * dx, y: rect.maxY))

            path.move(to: CGPoint(x: 0.0, y: Double(i) * dy))
            path.addLine(to: CGPoint(x: rect.maxX, y: Double(i) * dy))

            let lbl = NSAttributedString(string: "\(Double(i) * dx)", attributes: fontAttributes as [NSAttributedString.Key : Any])
            lbl.draw(at: CGPoint(x: Double(i) * dx, y: 0.0))
            
         }
        
        return path
    }
}

问题是什么?我是 SwiftUI 的新手,所以可能我犯了一些大错误。

我在网上尝试了许多其他方法,但没有结果。

string macos swiftui shapes
1个回答
0
投票

我认为

Shape
预计只会返回
Path
。我猜测标签不构成路径的一部分,因此当您抚摸路径时,看不到标签。

一种方法是使用

Canvas
代替:

var body: some View {
    Canvas { ctx, size in
        var path = Path()
        let dx: Double = size.width / 10.0
        var dy: Double = size.height / 10.0
        let font = Font.custom("Courier", size: 10.0)
        for i in 0 ... 10 {
            path.move(to: CGPoint(x: Double(i) * dx, y: 0.0))
            path.addLine(to: CGPoint(x: Double(i) * dx, y: size.height))

            path.move(to: CGPoint(x: 0.0, y: Double(i) * dy))
            path.addLine(to: CGPoint(x: size.width, y: Double(i) * dy))

            let text: Text = Text("\(Double(i) * dx)")
              .font(font)
            ctx.draw(text, at: CGPoint(x: Double(i) * dx, y: 10.0)) // y: 0.0 -> 10.0
        }
        ctx.stroke(path, with: .foreground)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.