You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI Chart中使用自定义Path形状作为数据标记?

使用自定义Shape作为SwiftUI Chart的数据标记

实现自定义ChartSymbolShape

要让你的BoatShape能作为图表数据标记,只需让它遵循ChartSymbolShape协议——这个协议会帮你把形状适配到图表的坐标系统中。修改你的BoatShape代码如下:

struct BoatShape: ChartSymbolShape {
    // 定义标记的默认尺寸,可根据需求调整
    var symbolFrame: CGRect {
        CGRect(x: 0, y: 0, width: 24, height: 24)
    }
    
    func path(in rect: CGRect) -> Path {
        var path = Path()
        
        // 保留你原本的形状绘制逻辑,示例如下:
        path.move(to: CGPoint(x: rect.midX, y: rect.minY))
        path.addLine(to: CGPoint(x: rect.maxX, y: rect.midY))
        path.addLine(to: CGPoint(x: rect.midX, y: rect.maxY))
        path.addLine(to: CGPoint(x: rect.minX, y: rect.midY))
        path.closeSubpath()
        
        return path
    }
}

接着修改你的Chart代码,用symbol()修饰符替换默认的PointMark样式:

Chart {
    PlotMark(
        x: .value("Boat", "Pace Boat"),
        y: .value("Pace Boat", (viewModel.duration*(Double(viewModel.split) / paceBoat)))
    )
    .symbol(BoatShape())
    .symbolSize(24) // 大小建议和symbolFrame定义的尺寸对应
    
    PlotMark(
        x: .value("Boat", "You"),
        y: .value("Your Pace", viewModel.boat.last?.1.distance ?? 0)
    )
    .symbol(BoatShape())
    .symbolSize(24)
}

注:用PlotMark比PointMark更适配自定义标记,当然你也可以继续用PointMark,只需给它加上.symbol(BoatShape())修饰符即可。

在形状上方添加绑定坐标的文本

如果要在自定义形状上方显示和图表坐标绑定的文本,用Annotation最方便,它会自动跟随数据点的位置:

Chart {
    PlotMark(
        x: .value("Boat", "Pace Boat"),
        y: .value("Pace Boat", (viewModel.duration*(Double(viewModel.split) / paceBoat)))
    )
    .symbol(BoatShape())
    .symbolSize(24)
    // 添加文本注释,自动对齐到标记上方
    .annotation(position: .top, alignment: .center) {
        Text("Pace")
            .font(.caption)
            .foregroundColor(.black)
    }
    
    PlotMark(
        x: .value("Boat", "You"),
        y: .value("Your Pace", viewModel.boat.last?.1.distance ?? 0)
    )
    .symbol(BoatShape())
    .symbolSize(24)
    .annotation(position: .top, alignment: .center) {
        Text("\(viewModel.boat.last?.1.distance ?? 0, specifier: "%.1f")")
            .font(.caption)
            .foregroundColor(.blue)
    }
}

内容的提问来源于stack exchange,提问作者Sapphire Carter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:40:44