基于 CGPath 的 CPTPlotSymbol 反转和扭曲

CGPath-based CPTPlotSymbol inverted and distorted

我目前正在散点图上使用自定义标记,发现自己遇到了一个问题,导致 CPTPlotSymbolCGPath 上下颠倒并扭曲。

我已经在 playground 中测试了创建路径的代码,它可以正常工作,以正确的形状和方向绘制路径。

路径绘制代码如下:

private func getOuterPathInRect(rect: CGRect) -> CGPath {
    let circlePath: CGPath = {
        let p = CGMutablePath()
        let topHundred = CGRect(x: 0, y: 0, width: 100, height: 100)
        p.addEllipse(in: topHundred)
        return p
    }()
    let arrowPath: CGPath = {
        let p = CGMutablePath()
        p.move(to: CGPoint(x: rect.midX, y: rect.maxY - 5.0))
        p.addLine(to: CGPoint(x: rect.midX - 7.5, y: rect.maxY - 15.0))
        p.addLine(to: CGPoint(x: rect.midX + 7.5, y: rect.maxY - 15.0))
        return p
    }()
    let path = CGMutablePath()
    path.addPath(circlePath)
    path.addPath(arrowPath)
    return path
}

创建 CPTPlotSymbol 的代码是:

func symbol(for plot: CPTScatterPlot, record idx: UInt) -> CPTPlotSymbol? {
    let index = Int(idx)
    guard items[index].requiresMarker else { return nil }
    let rect = CGRect(x: 0, y: 0, width: 120, height: 120)
    let marker = BallMarkerView()
    marker.contentMode = .center
    let path = marker.pathIn(rect: rect)
    let symbol = CPTPlotSymbol.customPlotSymbol(with: path)
    symbol.size = rect.size
    symbol.fill = CPTFill(color: CPTColor.red())
    return symbol
}

我的目标是使用自定义 UIView 作为标记,但我找不到 API 这样做,所以我求助于提供基于路径的标记并用图像表示填充它的标记。

这是正确的做法吗?

为什么我绘制的路径被扭曲和颠倒了?倒置的路径可以用 UIKit 和 CoreGraphics 之间的坐标系差异来解释,但这并不能解释扭曲。

谢谢!

因为 Core Plot 在 Mac 和 iOS 之间共享绘图代码,它在两个平台上使用相同的绘图坐标系,其中 (0, 0) 是绘图的左下角canvas。这是从 iOS.

上的正常绘图坐标系翻转过来的