Повысить взаимодействие пользователя с участками - PullRequest
1 голос
/ 10 февраля 2012

Когда я касаюсь линейного графика в моем графике многострочного графика, метод отображения символа со значениями, соответствующими точке, вызывается не часто,

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

Эта проблема также связана с диаграммами.Свойство plotSymbolMarginForHitDetection также имеет высокое значение.Но никакого эффекта.Как я могу улучшить взаимодействие с пользователем моего графика?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Не существует метода делегата рассеянного графика для обнаружения попаданий на линии между точками графика. Если это то, что вам нужно, вам нужно использовать делегат пространства заговора. Обработайте событие касания и просмотрите данные графика, чтобы определить, какой сегмент линии (если есть) находится вблизи точки касания.

Барные участки не так сложны. Любое прикосновение внутри панели должно вызывать метод делегата. У вас могут быть проблемы, если бары очень узкие. Единственное решение в этом случае - сделать их шире.

0 голосов
/ 26 июня 2015

Еще один способ увеличить «область попадания» - отслеживать все касания на графике и переводить их в ближайший индекс.

Для этого вам нужно убедиться, что делегат равен нулю (так как вы отслеживаете вручную).

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];

Виола!

...