CorePlot允许用户拖动旋转PieChart

时间:2015-01-07 20:04:53

标签: ios objective-c core-plot pie-chart

(至于我现在得到了解决方案,它在底部共享)

事实上,我一直在努力解决这个问题,我相信我发现的很多讨论都与较旧版本的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;

1 个答案:

答案 0 :(得分:0)

饼图centerAnchor以宽度和高度的分数给出。在计算dxdy之前,请务必将锚值乘以图表的相应维度。