Skip to content

Commit 08d9637

Browse files
author
Shahen Hovhannisyan
authored
Merge pull request #42 from shahen94/feature/tracker-move
feat(TrimmerView): Added ability to move tracker
2 parents 03a9878 + 293741c commit 08d9637

10 files changed

Lines changed: 103 additions & 48 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# MacOS temporary files
2+
.DS_Store
3+
14
# Logs
25
logs
36
*.log

ios/.DS_Store

-6 KB
Binary file not shown.

ios/RNVideoProcessing/.DS_Store

-8 KB
Binary file not shown.
-6 KB
Binary file not shown.

ios/RNVideoProcessing/RNTrimmerView/ICGVideoTrimmer/ICGThumbView.m

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
5555
return CGRectContainsPoint(hitFrame, point);
5656
}
5757

58+
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
59+
CGRect frame = CGRectInset(self.bounds, -20, -20);
60+
61+
return CGRectContainsPoint(frame, point) ? self : nil;
62+
}
63+
5864
- (void)drawRect:(CGRect)rect
5965
{
6066
// Drawing code
@@ -81,7 +87,7 @@ - (void)drawRect:(CGRect)rect
8187
[decoratingPath closePath];
8288
[[UIColor colorWithWhite:1 alpha:0.5] setFill];
8389
[decoratingPath fill];
84-
90+
8591
}
8692

8793

ios/RNVideoProcessing/RNTrimmerView/ICGVideoTrimmer/ICGVideoTrimmerView.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ NS_ASSUME_NONNULL_END
6868
@protocol ICGVideoTrimmerDelegate <NSObject>
6969

7070
- (void)trimmerView:(nonnull ICGVideoTrimmerView *)trimmerView didChangeLeftPosition:(CGFloat)startTime rightPosition:(CGFloat)endTime;
71+
- (void)trimmerView:(nonnull ICGVideoTrimmerView *)trimmerView currentPosition:(CGFloat)currentTime;
7172

7273
@end
7374

ios/RNVideoProcessing/RNTrimmerView/ICGVideoTrimmer/ICGVideoTrimmerView.m

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ @interface ICGVideoTrimmerView() <UIScrollViewDelegate>
2525
@property (strong, nonatomic) UIView *trackerView;
2626
@property (strong, nonatomic) UIView *topBorder;
2727
@property (strong, nonatomic) UIView *bottomBorder;
28+
@property (strong, nonatomic) UIPanGestureRecognizer *panGestureRecognizer;
2829

2930
@property (nonatomic) CGFloat startTime;
3031
@property (nonatomic) CGFloat endTime;
@@ -109,6 +110,8 @@ - (void)resetSubviews
109110
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
110111

111112
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame))];
113+
[self.scrollView setBounces:NO];
114+
[self.scrollView setScrollEnabled:NO];
112115
[self addSubview:self.scrollView];
113116
[self.scrollView setDelegate:self];
114117
[self.scrollView setShowsHorizontalScrollIndicator:NO];
@@ -151,12 +154,20 @@ - (void)resetSubviews
151154
self.leftThumbView = [[ICGThumbView alloc] initWithFrame:leftThumbFrame color:self.themeColor right:NO];
152155
}
153156

154-
self.trackerView = [[UIView alloc] initWithFrame:CGRectMake(self.thumbWidth, -5, 3, CGRectGetHeight(self.frameView.frame) + 10)];
157+
self.trackerView = [[UIView alloc] initWithFrame:CGRectMake(self.thumbWidth, -5, 3, CGRectGetHeight(self.frameView.frame) + 20)];
155158
self.trackerView.backgroundColor = self.trackerColor;
156159
self.trackerView.layer.masksToBounds = true;
157160
self.trackerView.layer.cornerRadius = 2;
161+
162+
[self.trackerView setUserInteractionEnabled:YES];
158163
[self addSubview:self.trackerView];
159164

165+
self.panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleTrackerPan:)];
166+
167+
[self.panGestureRecognizer locationInView:self.trackerView];
168+
169+
[self.trackerView addGestureRecognizer:self.panGestureRecognizer];
170+
160171
[self.leftThumbView.layer setMasksToBounds:YES];
161172
[self.leftOverlayView addSubview:self.leftThumbView];
162173
[self.leftOverlayView setUserInteractionEnabled:YES];
@@ -192,6 +203,18 @@ - (void)updateBorderFrames
192203
[self.bottomBorder setFrame:CGRectMake(CGRectGetMaxX(self.leftOverlayView.frame), CGRectGetHeight(self.frameView.frame)-height, CGRectGetMinX(self.rightOverlayView.frame)-CGRectGetMaxX(self.leftOverlayView.frame), height)];
193204
}
194205

206+
- (void)handleTrackerPan: (UISwipeGestureRecognizer *) recognizer {
207+
CGPoint point = [self.panGestureRecognizer locationInView:self.trackerView];
208+
209+
CGRect trackerFrame = self.trackerView.frame;
210+
trackerFrame.origin.x += point.x;
211+
self.trackerView.frame = trackerFrame;
212+
213+
CGFloat time = (trackerFrame.origin.x - self.thumbWidth + self.scrollView.contentOffset.x) / self.widthPerSecond;
214+
[self.delegate trimmerView:self currentPosition:time ];
215+
216+
}
217+
195218
- (void)moveLeftOverlayView:(UIPanGestureRecognizer *)gesture
196219
{
197220
switch (gesture.state) {

ios/RNVideoProcessing/RNTrimmerView/RNTrimmerView.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class RNTrimmerView: RCTView, ICGVideoTrimmerDelegate {
1515
var mThemeColor = UIColor.clear
1616
var bridge: RCTBridge!
1717
var onChange: RCTBubblingEventBlock?
18+
var onTrackerMove: RCTBubblingEventBlock?
1819
var _minLength: CGFloat? = nil
1920
var _maxLength: CGFloat? = nil
2021
var _trackerColor: UIColor = UIColor.clear
@@ -173,4 +174,13 @@ class RNTrimmerView: RCTView, ICGVideoTrimmerDelegate {
173174
func trimmerView(_ trimmerView: ICGVideoTrimmerView, didChangeLeftPosition startTime: CGFloat, rightPosition endTime: CGFloat) {
174175
onTrimmerPositionChange(startTime: startTime, endTime: endTime)
175176
}
177+
178+
public func trimmerView(_ trimmerView: ICGVideoTrimmerView, currentPosition currentTime: CGFloat) {
179+
print("current", currentTime)
180+
if onTrackerMove == nil {
181+
return
182+
}
183+
let event = ["currentTime": currentTime]
184+
self.onTrackerMove!(event)
185+
}
176186
}

ios/RNVideoProcessing/RNTrimmerView/RNTrimmerViewBridge.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ @interface RCT_EXTERN_MODULE(RNTrimmerViewManager, RCTViewManager)
1515
RCT_EXPORT_VIEW_PROPERTY(height, NSNumber)
1616
RCT_EXPORT_VIEW_PROPERTY(themeColor, NSString)
1717
RCT_EXPORT_VIEW_PROPERTY(onChange, RCTBubblingEventBlock)
18+
RCT_EXPORT_VIEW_PROPERTY(onTrackerMove, RCTBubblingEventBlock)
1819
RCT_EXPORT_VIEW_PROPERTY(minLength, NSNumber)
1920
RCT_EXPORT_VIEW_PROPERTY(maxLength, NSNumber)
2021
RCT_EXPORT_VIEW_PROPERTY(currentTime, NSNumber)

lib/Trimmer/Trimmer.ios.js

Lines changed: 57 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,63 +4,74 @@ import { getActualSource } from '../utils';
44
const TRIMMER_COMPONENT_NAME = 'RNTrimmerView';
55

66
export class Trimmer extends Component {
7-
static propTypes = {
8-
source: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
9-
width: PropTypes.number,
10-
height: PropTypes.number,
11-
themeColor: PropTypes.string,
12-
onChange: PropTypes.func,
13-
minLength: PropTypes.number,
14-
maxLength: PropTypes.number,
15-
currentTime: PropTypes.number,
16-
trackerColor: PropTypes.string
17-
};
7+
static propTypes = {
8+
source: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
9+
width: PropTypes.number,
10+
height: PropTypes.number,
11+
themeColor: PropTypes.string,
12+
onChange: PropTypes.func,
13+
onTrackerMove: PropTypes.func,
14+
minLength: PropTypes.number,
15+
maxLength: PropTypes.number,
16+
currentTime: PropTypes.number,
17+
trackerColor: PropTypes.string
18+
};
1819

19-
static defaultProps = {
20-
themeColor: 'gray',
21-
trackerColor: 'black'
22-
};
20+
static defaultProps = {
21+
themeColor: 'gray',
22+
trackerColor: 'black'
23+
};
2324

24-
constructor(...args) {
25-
super(...args);
26-
this.state = {};
27-
this._onChange = this._onChange.bind(this);
28-
}
25+
constructor(...args) {
26+
super(...args);
27+
this.state = {};
28+
this._onChange = this._onChange.bind(this);
29+
this._handleTrackerMove = this._handleTrackerMove.bind(this);
30+
}
2931

30-
_onChange(event) {
31-
if (!this.props.onChange) {
32-
return;
33-
}
34-
this.props.onChange(event.nativeEvent);
35-
}
32+
_onChange(event) {
33+
if (!this.props.onChange) {
34+
return;
35+
}
36+
this.props.onChange(event.nativeEvent);
37+
}
3638

37-
render() {
38-
const {
39-
source,
39+
_handleTrackerMove({ nativeEvent }) {
40+
const { onTrackerMove } = this.props;
41+
const { currentTime } = nativeEvent;
42+
if (typeof onTrackerMove === 'function') {
43+
onTrackerMove({ currentTime });
44+
}
45+
}
46+
47+
render() {
48+
const {
49+
source,
4050
width,
4151
height,
4252
themeColor,
4353
minLength,
4454
maxLength,
4555
currentTime,
4656
trackerColor
47-
} = this.props;
48-
const actualSource = getActualSource(source);
49-
return (
50-
<RNTrimmer
51-
source={actualSource}
52-
width={width}
53-
height={height}
54-
currentTime={currentTime}
55-
themeColor={processColor(themeColor).toString()}
56-
trackerColor={processColor(trackerColor).toString()}
57-
pointerEvents={'box-none'}
58-
onChange={this._onChange}
59-
minLength={minLength}
60-
maxLength={maxLength}
61-
/>
62-
);
63-
}
57+
} = this.props;
58+
const actualSource = getActualSource(source);
59+
return (
60+
<RNTrimmer
61+
source={actualSource}
62+
width={width}
63+
height={height}
64+
currentTime={currentTime}
65+
themeColor={processColor(themeColor).toString()}
66+
trackerColor={processColor(trackerColor).toString()}
67+
onTrackerMove={this._handleTrackerMove}
68+
pointerEvents={'box-none'}
69+
onChange={this._onChange}
70+
minLength={minLength}
71+
maxLength={maxLength}
72+
/>
73+
);
74+
}
6475
}
6576

6677
const RNTrimmer = requireNativeComponent(TRIMMER_COMPONENT_NAME, Trimmer);

0 commit comments

Comments
 (0)