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

时间:2018-02-19 13:14:29

标签: ios swift math geometry pie-chart

Screenshot of 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 ))

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;
}

1 个答案:

答案 0 :(得分:2)

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

  

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

因此,要解决此问题,您可以找到以下line in createSlice

    mask.frame = self.frame

并将其替换为

    mask.frame = self.bounds

P.S。您的代码有一行

pieChart = MDRotatingPieChart(frame: CGRect(x: 30, y: 30, width: view.frame.width + 30 , height: view.frame.width + 30 ))

这是可疑的。您几乎不希望孩子的widthheight超过相应的父级维度。你可能想要

pieChart = MDRotatingPieChart(frame: CGRect(x: 30, y: 30,
             width: view.frame.width - 30 , height: view.frame.width - 30 ))

或者甚至(如果你想在X和Y中都有对称的边距)

pieChart = MDRotatingPieChart(frame: CGRect(x: 30, y: 30, 
               width: view.frame.width - 2*30 , height: view.frame.width - 2*30 ))

代替。