Еще один способ увеличить «область попадания» - отслеживать все касания на графике и переводить их в ближайший индекс.
Для этого вам нужно убедиться, что делегат равен нулю (так как вы отслеживаете вручную).
self.myBarPlot.delegate = nil;
Затем на вашем CPTGraphHostingView
настройте UIGestureRecognizers
. Я обнаружил, что лучше всего использовать как функции распознавания, так и панорамирования. Настройте их так.
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];
Виола!