// // YYControl.m // YYKitExample // // Created by ibireme on 15/9/14. // Copyright (c) 2015 ibireme. All rights reserved. // #import "YYControl.h" #import "YYKit.h" @implementation YYControl { UIImage *_image; CGPoint _point; NSTimer *_timer; BOOL _longPressDetected; } - (void)setImage:(UIImage *)image { _image = image; self.layer.contents = (id)image.CGImage; } - (void)dealloc { [self endTimer]; } - (UIImage *)image { id content = self.layer.contents; if (content != (id)_image.CGImage) { CGImageRef ref = (__bridge CGImageRef)(content); if (ref && CFGetTypeID(ref) == CGImageGetTypeID()) { _image = [UIImage imageWithCGImage:ref scale:self.layer.contentsScale orientation:UIImageOrientationUp]; } else { _image = nil; } } return _image; } - (void)startTimer { [_timer invalidate]; _timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(timerFire) userInfo:nil repeats:NO]; [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes]; } - (void)endTimer { [_timer invalidate]; _timer = nil; } - (void)timerFire { [self touchesCancelled:[NSSet set] withEvent:nil]; _longPressDetected = YES; if (_longPressBlock) _longPressBlock(self, _point); [self endTimer]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { _longPressDetected = NO; if (_touchBlock) { _touchBlock(self, YYGestureRecognizerStateBegan, touches, event); } if (_longPressBlock) { UITouch *touch = touches.anyObject; _point = [touch locationInView:self]; [self startTimer]; } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if (_longPressDetected) return; if (_touchBlock) { _touchBlock(self, YYGestureRecognizerStateMoved, touches, event); } [self endTimer]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (_longPressDetected) return; if (_touchBlock) { _touchBlock(self, YYGestureRecognizerStateEnded, touches, event); } [self endTimer]; } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { if (_longPressDetected) return; if (_touchBlock) { _touchBlock(self, YYGestureRecognizerStateCancelled, touches, event); } [self endTimer]; } @end