当我触摸多线绘图图中的线图时,不会频繁调用显示具有与该点对应的值的符号的方法,
-(void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index;
这个问题也与情节有关。 plotSymbolMarginForHitDetection属性也设置为高值。但没有效果。如何增加图表的用户互动?
答案 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];
中提琴!