Source-SCCamera/UI/SCLongPressGestureRecognizer.m

89 lines
2.7 KiB
Objective-C

//
// 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