Please note, this blog entry is from a previous course. You might want to check out the current one.
Support the following gestures inside your graphing view:
- Pinching (adjusts your view’s scale).
- Panning (moves the entire graph, including axes, to follow the touch around).
- Triple-tapping (moves the origin of the graph to the point of the triple-tap).
We add the actual functions to the view, where we
- adjust the scale of the data source when we pinch,
- adjust the origin of the data source when we pan or center.
- (void)pinch:(UIPinchGestureRecognizer *)gesture
{
if ((gesture.state != UIGestureRecognizerStateChanged) &&
(gesture.state != UIGestureRecognizerStateEnded)) return;
self.dataSource.scale *= gesture.scale;
gesture.scale = 1;
}
- (void)pan:(UIPanGestureRecognizer *)gesture
{
if ((gesture.state != UIGestureRecognizerStateChanged) &&
(gesture.state != UIGestureRecognizerStateEnded)) return;
CGPoint translation = [gesture translationInView:self];
translation.x += self.dataSource.origin.x;
translation.y += self.dataSource.origin.y;
self.dataSource.origin = translation;
[gesture setTranslation:CGPointZero inView:self];
}
- (void)center:(UITapGestureRecognizer *)gesture
{
if (gesture.state != UIGestureRecognizerStateEnded) return;
CGPoint location = [gesture locationInView:self];
self.dataSource.origin = location;
}
and setup the gesture recognizers in setGraphView:
[graphView addGestureRecognizer:[[UIPinchGestureRecognizer alloc]
initWithTarget:self.graphView action:@selector(pinch:)]];
[self.graphView addGestureRecognizer:[[UIPanGestureRecognizer alloc]
initWithTarget:self.graphView action:@selector(pan:)]];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self.graphView action:@selector(center:)];
tap.numberOfTapsRequired = 3;
[self.graphView addGestureRecognizer:tap];
To see the change we need to updated the views:
- (void)setScale:(CGFloat)scale
{
if (scale == _scale) return;
_scale = scale;
[self.graphView setNeedsDisplay];
}
- (void)setOrigin:(CGPoint)origin
{
if (CGPointEqualToPoint(origin, _origin)) return;
_origin = origin;
[self.graphView setNeedsDisplay];
}