(至于我现在得到了解决方案,它在底部共享)
事实上,我一直在努力解决这个问题,我相信我发现的很多讨论都与较旧版本的CorePlot或未答复有关。
首先,我使用的是CorePlot 1.5.1。
我已经能够绘制一个PieChart,现在我希望用户能够通过在屏幕上拖动来旋转它(直接触摸pieChart或主视图并不重要。)
目前使用这些代表:
@interface MyChartViewController : UIViewController<CPTPieChartDataSource,CPTPlotSpaceDelegate,CPTPieChartDelegate>
有一个hostView,
@property (strong, nonatomic) IBOutlet CPTGraphHostingView *hostView;
制作图表,设置为,self.hostView.hostedGraph = graph
并制作了一个PieChart,放入图中,[graph addPlot:self.mainPieChart];
(我为pieChart设置了一个强大的属性,让我随时引用它)
所以,这是我的第一次尝试,事实是,它正在响应,(虽然不是一种理想的方式)
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) self.hostView.hostedGraph.defaultPlotSpace;
[plotSpace setDelegate:self];
(只能通过将plotSpace委托设置为self,不确定原因,我猜它是关于找到接收用户交互的方式,无论如何,然后我覆盖这两个函数)
使用此值: static float deltaAngle;
-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(UIEvent *)event atPoint:(CGPoint)point
{
float dx = point.x - self.mainPieChart.centerAnchor.x;
float dy = point.y - self.mainPieChart.centerAnchor.y;
deltaAngle = atan2(dy,dx);
return YES;
}
这样,为了保存第一个触点
然后感觉拖动确实使用差异进行旋转
(至少我是这么想的)
-(BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(UIEvent *)event atPoint:(CGPoint)point
{
int x = self.mainPieChart.centerAnchor.x;
int y = self.mainPieChart.centerAnchor.y;
float dx = point.x - x;
float dy = point.y - y;
double a = atan2(dx,dy);
float angleDifference = deltaAngle - a;
self.mainPieChart.startAngle = -angleDifference;
return YES;
}
以下是关于它的图片,不过我认为我已经涵盖了大部分细节。
http://postimg.org/image/bey0fosqj/
虽然是横向模式。
事实是我认为这将是最适合调用的函数,但不知何故我无法调用它(非常确定我已将self.mainPieChart委托/数据源设置为self)
-(BOOL)pointingDeviceDraggedEvent:(id)event atPoint:(CGPoint)interactionPoint{
(进一步测试后)
有趣的是,在尝试打印出不同的值后,通过shouldHandlePointingDevice函数(只需单击),我想我现在有了一些想法。
self.mainPieChart.centerAnchor.x / y值始终返回0.5(两者)
然而,点x,点y的返回值从1-500 +,
变化 似乎更像是在比较两件事情,尽管他们从不同的角度来看彼此之上。可能PlotSpace集委托部分搞砸了。
=============================================== =============
所以,至于现在我还是不知道怎么调用 - (BOOL)pointingDeviceDraggedEvent:(id)event atPoint:(CGPoint)interactionPoint {,我试着将它放入if循环中,如
if([self.mainPieChart pointingDeviceDownEvent:event atPoint:self.mainPieChart.centerAnchor] == YES)
在我感动的功能下但没有发生任何事情,没关系。
回到这一点,即使在应用填充之后,我现在的解决方案也能正常运行。
float x = (self.hostView.bounds.size.width + self.hostView.hostedGraph.paddingLeft)*self.mainPieChart.centerAnchor.x;
float y = self.hostView.bounds.size.height * self.mainPieChart.centerAnchor.y;
float dx = point.x - x;
float dy = point.y - y;
double a = atan2(dx,dy);
这些线对于按下/拖动功能都是相同的,与拖动功能一样,
float angleDifference = deltaAngle - a;
self.mainPieChart.startAngle = angleDifference;
在结束之前添加
然而,当饼图不在中间时,情况略有不同,换句话说,填充饼图的图形被填充。 (我的例子不知怎的是中间位置只是为了让它变得容易)
你只需要将上面的x y浮动值贬值,它比我预期的要容易。
例如,如果我有, graph.paddingLeft = -300.0f;
按下/拖动时浮动x的值将变为
float x = (self.hostView.bounds.size.width + self.hostView.hostedGraph.paddingLeft)*self.mainPieChart.centerAnchor.x;
答案 0 :(得分:0)
饼图centerAnchor
以宽度和高度的分数给出。在计算dx
和dy
之前,请务必将锚值乘以图表的相应维度。