【发布时间】:2015-01-07 20:04:52
【问题描述】:
(至于我现在得到了解决方案,在底部分享)
事实上,我一直在为此苦苦挣扎,我相信我发现的很多讨论都与旧版本的 CorePlot 相关或未得到答复。
首先,我使用的是 CorePlot 1.5.1。
我已经能够绘制饼图,现在我希望用户能够通过在屏幕上拖动来旋转它(直接触摸饼图或主机视图并不重要)。
目前正在使用这些代表:
@interface MyChartViewController : UIViewController<CPTPieChartDataSource,CPTPlotSpaceDelegate,CPTPieChartDelegate>
有一个主机视图,
@property (strong, nonatomic) IBOutlet CPTGraphHostingView *hostView;
做了一个图,设置为,self.hostView.hostedGraph = graph
并制作了一个PieChart,放入图中,[graph addPlot:self.mainPieChart];
(我为饼图设置了一个强大的属性让我随时参考)
所以,这是我的第一次尝试,事实上,它正在响应,(虽然不是以一种理想的方式)
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *) self.hostView.hostedGraph.defaultPlotSpace;
[plotSpace setDelegate:self];
(只能通过将plotSpace委托设置为self,不知道为什么,我想这是为了找到一种接收用户交互的方法,无论如何,然后我覆盖了这两个函数)
使用这个值: 静态浮点 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;
float x 在按下/拖动时的值都会变成
float x = (self.hostView.bounds.size.width + self.hostView.hostedGraph.paddingLeft)*self.mainPieChart.centerAnchor.x;
【问题讨论】:
标签: ios objective-c core-plot pie-chart