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