基于 CGPath 的 CPTPlotSymbol 反转和扭曲
CGPath-based CPTPlotSymbol inverted and distorted
我目前正在散点图上使用自定义标记,发现自己遇到了一个问题,导致 CPTPlotSymbol
从 CGPath
上下颠倒并扭曲。
我已经在 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.
上的正常绘图坐标系翻转过来的
我目前正在散点图上使用自定义标记,发现自己遇到了一个问题,导致 CPTPlotSymbol
从 CGPath
上下颠倒并扭曲。
我已经在 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.
上的正常绘图坐标系翻转过来的