【问题标题】:CorePlot allow user drag rotate PieChartCorePlot 允许用户拖动旋转 PieChart
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 埃里克,你绝对是对的。非常感谢(我的解决方案在上面分享给其他人)。但是我仍然想知道为什么(1)我不能调用/覆盖 -(BOOL)pointingDeviceDraggedEvent: 这应该是用于 PieChart 的。以及(2)为什么当我设置 CPTXYPlotSpace *plotSpace = (CPTPlotSpace *) self.mainPieChart.plotSpace; 时行为是相同的;
    • 2) 除非您在图表中添加了绘图空间(饼图不需要),否则它只有一个。因此,图形的默认空间和饼图的绘图空间是相同的。
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-17
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多