1
2
3//
4//  RNPinchHandler.m
5//  RNGestureHandler
6//
7//  Created by Krzysztof Magiera on 12/10/2017.
8//  Copyright © 2017 Software Mansion. All rights reserved.
9//
10
11#import "RNPinchHandler.h"
12
13#if !TARGET_OS_TV
14@interface RNBetterPinchRecognizer : UIPinchGestureRecognizer
15
16- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler;
17
18@end
19
20@implementation RNBetterPinchRecognizer {
21  __weak RNGestureHandler *_gestureHandler;
22}
23
24- (id)initWithGestureHandler:(RNGestureHandler *)gestureHandler
25{
26  if ((self = [super initWithTarget:self action:@selector(handleGesture:)])) {
27    _gestureHandler = gestureHandler;
28  }
29  return self;
30}
31
32- (void)handleGesture:(UIGestureRecognizer *)recognizer
33{
34  if (self.state == UIGestureRecognizerStateBegan) {
35    self.scale = 1;
36  }
37  [_gestureHandler handleGesture:recognizer];
38}
39
40- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
41{
42  [super touchesBegan:touches withEvent:event];
43  [_gestureHandler.pointerTracker touchesBegan:touches withEvent:event];
44}
45
46- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
47{
48  [super touchesMoved:touches withEvent:event];
49  [_gestureHandler.pointerTracker touchesMoved:touches withEvent:event];
50}
51
52- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
53{
54  [super touchesEnded:touches withEvent:event];
55  [_gestureHandler.pointerTracker touchesEnded:touches withEvent:event];
56}
57
58- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
59{
60  [super touchesCancelled:touches withEvent:event];
61  [_gestureHandler.pointerTracker touchesCancelled:touches withEvent:event];
62}
63
64- (void)reset
65{
66  [_gestureHandler.pointerTracker reset];
67  [super reset];
68}
69
70@end
71#endif
72
73@implementation RNPinchGestureHandler
74
75- (instancetype)initWithTag:(NSNumber *)tag
76{
77  if ((self = [super initWithTag:tag])) {
78#if !TARGET_OS_TV
79    _recognizer = [[RNBetterPinchRecognizer alloc] initWithGestureHandler:self];
80#endif
81  }
82  return self;
83}
84
85#if !TARGET_OS_TV
86- (RNGestureHandlerEventExtraData *)eventExtraData:(UIPinchGestureRecognizer *)recognizer
87{
88  return [RNGestureHandlerEventExtraData forPinch:recognizer.scale
89                                   withFocalPoint:[recognizer locationInView:recognizer.view]
90                                     withVelocity:recognizer.velocity
91                              withNumberOfTouches:recognizer.numberOfTouches];
92}
93#endif
94
95@end
96