旋转MDRotatingPieChart会改变x/y位置而不是角度

var*_*run 5 math geometry ios pie-chart swift

MDRotatingPieChart的屏幕截图

我希望在我的iOS应用程序中有一个旋转饼图.我发现MDRotatingPieChart控件似乎完成了我需要的大部分操作.但是当我将它放入非(0,0)原点并开始拖动时,它也会改变饼图的X和Y位置.它不应该这样做.有人可以帮帮我吗?

这是相似的代码

pieChart = MDRotatingPieChart(frame: CGRect(x: 30, y: 30, width: view.frame.width + 30 , height: view.frame.width + 30 ))
Run Code Online (Sandbox Code Playgroud)

在里面MDRotatingPieChart:

override func continueTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
    hasBeenDraged = true
    let currentPoint = touch.location(in: self)
    let deltaX = currentPoint.x - pieChartCenter.x - 15
    let deltaY = currentPoint.y - pieChartCenter.y - 15
    let ang = atan2(deltaY,deltaX);
    let angleDifference = delta - ang
    self.transform = self.transform.rotated(by: -angleDifference)
    let savedTransform = slicesArray[0].labelObj?.transform
    let savedTransformCenter = labelCenter.transform
    for slice in slicesArray  {
        if(slice.labelObj != nil)  {
            slice.labelObj?.transform = savedTransform!.rotated(by: angleDifference)
        }
    }
    labelCenter.transform = savedTransformCenter.rotated(by: angleDifference)
    return true;
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*gGr 2

首先,看起来您应该使用MDRotatingPieChart-Example 文件夹中的 MDRotatingPieChart.swift ,因为它更加现代。它仍然包含您描述的错误,并且错误的来源似乎是原始开发人员不知道frame和之间的区别bounds,根据UIView文档

每个视图的几何形状由其framebounds属性定义。该frame属性定义视图在其父视图的坐标系中的原点和尺寸。该bounds属性定义视图所看到的内部尺寸,并且几乎专门用于自定义绘图代码。

因此,要解决此问题,您可以在 createSlice 中找到以下行

    mask.frame = self.frame
Run Code Online (Sandbox Code Playgroud)

并将其替换为

    mask.frame = self.bounds
Run Code Online (Sandbox Code Playgroud)

PS你的代码有一行

pieChart = MDRotatingPieChart(frame: CGRect(x: 30, y: 30, width: view.frame.width + 30 , height: view.frame.width + 30 ))
Run Code Online (Sandbox Code Playgroud)

这是可疑的。您几乎永远不希望子级中的width任何一个height大于相应父级的尺寸。你可能想要

pieChart = MDRotatingPieChart(frame: CGRect(x: 30, y: 30,
             width: view.frame.width - 30 , height: view.frame.width - 30 ))
Run Code Online (Sandbox Code Playgroud)

甚至(如果您想要 X 和 Y 上的边距对称)

pieChart = MDRotatingPieChart(frame: CGRect(x: 30, y: 30, 
               width: view.frame.width - 2*30 , height: view.frame.width - 2*30 ))
Run Code Online (Sandbox Code Playgroud)

反而。