增加用户与图表的交互

时间:2012-02-10 12:38:23

标签: core-plot

当我触摸多线绘图图中的线图时,不会频繁调用显示具有与该点对应的值的符号的方法,

-(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index;

这个问题也与情节有关。 plotSymbolMarginForHitDetection属性也设置为高值。但没有效果。如何增加图表的用户互动?

2 个答案:

答案 0 :(得分:1)

没有散点图委托方法来检测绘图点之间的线上的命中。如果这就是您所追求的,您将需要使用绘图空间委托。处理触摸事件并查看绘图数据以查找触摸点附近的线段(如果有)。

条形图并不复杂。栏内的任何触摸都应触发委托方法。如果条形很窄,您可能会遇到问题。在这种情况下,唯一的解决方案是使它们更宽。

答案 1 :(得分:0)

增加“点击区域”的另一种方法是监控图表中的所有触摸并将其转换为最接近的索引。

要做到这一点,你必须确保委托是零(因为你是手动监控)。

self.myBarPlot.delegate = nil;

然后,在CPTGraphHostingView上设置UIGestureRecognizers。我发现使用tap和pan recogizners效果最好。将它们设置为这样。

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(graphTapped:)];
[self.hostView addGestureRecognizer:tapRecognizer];

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(graphPanned:)];
[self.hostView addGestureRecognizer:panRecognizer];

识别器将监控您的hostView被点击或平移的时间。从那里,您可以轻松地将触摸的位置转换为执行以下操作的索引。

- (void)graphTapped:(UITapGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateEnded) {
        [self gestureUpdated:sender];
    }
}

- (void)graphPanned:(UIPanGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateChanged) {
        [self gestureUpdated:sender];
    }
}

- (void)gestureUpdated:(UIGestureRecognizer *)sender {
    CGFloat width = self.hostView.frame.size.width;
    CGPoint loc = [sender locationInView:self.hostView];
    NSInteger index = (loc.x / width) * [self numberOfRecordsForPlot:self.myBarPlot];
    NSLog(@"Touch index: %li", index);
}

现在我们有了索引,只需继续执行您在原始委托回调中所做的操作。

对于条形图:

[self barPlot:self.myBarPlot barWasSelectedAtRecordIndex:index];

对于散点图(未经测试):

[self scatterPlot:self.myScatterPlot plotSymbolWasSelectedAtRecordIndex:index];

中提琴!