我想在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;
}
答案 0 :(得分:2)
首先,看起来您应该使用MDRotatingPieChart-Example folder中的MDRotatingPieChart.swift,因为它更加现代化。它仍然包含您描述的错误,并且错误的来源似乎是原始开发人员不知道frame
和bounds
之间根据UIView
doc的区别:
每个视图的几何图形由其
frame
和bounds
属性定义。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 ))
这是可疑的。您几乎不希望孩子的width
或height
超过相应的父级维度。你可能想要
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 ))
代替。