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