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

5

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

不确定您在问什么。当饼图旋转时,它的x和y会改变吗? - kid_x
1个回答

2
首先,看起来你应该使用来自MDRotatingPieChart-Example文件夹的MDRotatingPieChart.swift,因为它更加现代化。然而,它仍然包含了你描述的错误,而这个错误的源头似乎是原始开发者不知道framebounds之间的区别,而根据UIView文档,它们的定义如下:

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

所以要修复这个问题,你可以找到createSlice中的以下行:

    mask.frame = self.frame

并将其替换为

    mask.frame = self.bounds

附注:你的代码中有一行

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

替代方案。


非常感谢你,你是我的救星。 - varun
1
@varun,欢迎您。顺便提一下,我认为如果您的问题在我的编辑之前就已经很好了,那么您可能不需要开始悬赏。好问题是获得好答案的重要步骤!(它仍然远非完美,例如它仍然缺少[MCVE],但至少明确指出您使用第三方控件并且问题可能在该控件内部。) - SergGr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接