You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.7 KiB
88 lines
2.7 KiB
//
|
|
// SCLongPressGestureRecognizer.m
|
|
// SCCamera
|
|
//
|
|
// Created by Pavlo Antonenko on 4/28/15.
|
|
// Copyright (c) 2015 Snapchat, Inc. All rights reserved.
|
|
//
|
|
|
|
#import "SCLongPressGestureRecognizer.h"
|
|
|
|
#import <SCFoundation/SCLog.h>
|
|
|
|
#import <UIKit/UIGestureRecognizerSubclass.h>
|
|
|
|
@implementation SCLongPressGestureRecognizer {
|
|
CGPoint _initialPoint;
|
|
CGFloat _initialTime;
|
|
}
|
|
|
|
- (instancetype)initWithTarget:(id)target action:(SEL)action
|
|
{
|
|
self = [super initWithTarget:target action:action];
|
|
if (self) {
|
|
_allowableMovementAfterBegan = FLT_MAX;
|
|
_timeBeforeUnlimitedMovementAllowed = 0.0;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)reset
|
|
{
|
|
[super reset];
|
|
_initialPoint = CGPointZero;
|
|
_initialTime = 0;
|
|
_forceOfAllTouches = 1.0;
|
|
_maximumPossibleForceOfAllTouches = 1.0;
|
|
self.failedByMovement = NO;
|
|
}
|
|
|
|
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
|
|
{
|
|
[super touchesBegan:touches withEvent:event];
|
|
_initialPoint = [self locationInView:self.view];
|
|
_initialTime = CACurrentMediaTime();
|
|
_forceOfAllTouches = 1.0;
|
|
for (UITouch *touch in touches) {
|
|
_maximumPossibleForceOfAllTouches = MAX(touch.maximumPossibleForce, _maximumPossibleForceOfAllTouches);
|
|
_forceOfAllTouches = MAX(touch.force, _forceOfAllTouches);
|
|
}
|
|
}
|
|
|
|
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
|
|
{
|
|
[super touchesMoved:touches withEvent:event];
|
|
|
|
_forceOfAllTouches = 1.0;
|
|
for (UITouch *touch in touches) {
|
|
_maximumPossibleForceOfAllTouches = MAX(touch.maximumPossibleForce, _maximumPossibleForceOfAllTouches);
|
|
_forceOfAllTouches = MAX(touch.force, _forceOfAllTouches);
|
|
}
|
|
|
|
if (!CGPointEqualToPoint(_initialPoint, CGPointZero)) {
|
|
CGPoint currentPoint = [self locationInView:self.view];
|
|
|
|
CGFloat distance = hypot(_initialPoint.x - currentPoint.x, _initialPoint.y - currentPoint.y);
|
|
CGFloat timeDifference = CACurrentMediaTime() - _initialTime;
|
|
|
|
if (distance > self.allowableMovementAfterBegan && timeDifference < self.timeBeforeUnlimitedMovementAllowed) {
|
|
SCLogGeneralInfo(@"Long press moved %.2f > %.2f after %.3f < %.3f seconds, and is cancelled", distance,
|
|
self.allowableMovementAfterBegan, timeDifference, self.timeBeforeUnlimitedMovementAllowed);
|
|
self.state = UIGestureRecognizerStateFailed;
|
|
self.failedByMovement = YES;
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)setEnabled:(BOOL)enabled
|
|
{
|
|
SCLogGeneralInfo(@"Setting enabled: %d for %@", enabled, self);
|
|
[super setEnabled:enabled];
|
|
}
|
|
|
|
- (BOOL)isUnlimitedMovementAllowed
|
|
{
|
|
return CACurrentMediaTime() - _initialTime > self.timeBeforeUnlimitedMovementAllowed;
|
|
}
|
|
|
|
@end
|