ios - 旋转MDRotatingPieChart更改x/y位置而不是角度-LMLPHP

我想在我的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;
}

最佳答案

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



因此,要解决此问题,您可以找到以下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 ))

这是可疑的。您几乎永远都不希望 child 的widthheight超过相应 parent 的尺寸。你可能想要
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 ))

反而。

10-07 15:11