2013-08-14 1 views
1

몇 가지 흥미로운 것을 묻고 싶습니다. 사용자 정의 결합 제스처가 발생하면 내 앱이 작업을 수행 할 수 있기를 원합니다. 예 : 손가락을 화면에 두지 않고 왼쪽, 위, 왼쪽으로 스 와이프 할 때 동작 (/ 방법)을 호출합니다. 어떻게이 사용자 지정 제스처를 만들 수 있습니까?결합 된 제스처를 만드는 방법은 무엇입니까?

두 번째 질문은 왼쪽 상단을 스 와이프 할 수 있습니까 ("/"이 방향)? 이 제스처를 만드는 방법은 무엇입니까?

아무도 도와 줄 수 있습니까? 부디! 감사합니다

답변

1

음, 개념적으로 UIGestureRecognizer를 하위 클래스로 분류하고 위치 추적을 수행하고 UIGestureRecognizerSubclass.h을 가져온 후 제스처 상태 속성이 자신 주위의 모든 기어를 이동시키기 위해 읽기/쓰기가된다는 사실을 이용해야합니다. 예를 들어 오래 전에 만들려고했던 대각선 제스처의 기본 프로토 타입을 포함 할 것입니다. (그것은 몇 가지 단점을 보완 밖으로 일이 필요하지만 전반적으로, 그것은 작동합니다.)

.H

#import <UIKit/UIKit.h> 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@interface MMDiagnoalSwipeGestureRecognizer : UIGestureRecognizer 
@property (nonatomic, readwrite) BOOL shouldReverseYDelta; 
@property (nonatomic, readwrite) CGFloat tolerance; 
@property (nonatomic, readonly) CGFloat angleOfSwipe; 
@end 

하는 .m

#import "MMDiagnoalSwipeGestureRecognizer.h" 
@interface MMDiagnoalSwipeGestureRecognizer() 
@property (nonatomic, readwrite) CGPoint startingPoint; 
@end 

@implementation MMDiagnoalSwipeGestureRecognizer 


- (id)initWithTarget:(id)target action:(SEL)action { 
    self = [super initWithTarget:target action:action]; 
    if (self) { 
     _shouldReverseYDelta = NO; 
     _tolerance = 30.0f; 
    } 
    return self; 
} 

- (CGFloat)angleOfGestureFromPoint:(CGPoint)start toEndPoint:(CGPoint)end { 
    CGFloat deltaY = (_shouldReverseYDelta) ? end.y - start.y : start.y - end.y; 
    CGFloat deltaX = end.x - start.x; 

    _angleOfSwipe = atan2f(deltaY, deltaX) * 180.0f/M_PI; 

    return _angleOfSwipe; 
} 

- (CGFloat)diagonalDistanceFromPoint:(CGPoint)start toEndPoint:(CGPoint)end { 
    CGFloat deltaX = fabsf(start.x - end.x); 
    CGFloat deltaY = fabsf(start.y - end.y); 

    CGFloat hypotenuse = powf(deltaX, 2.0f) + powf(deltaY, 2.0f); 

    return sqrtf(hypotenuse); 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (touches.count > 1) { 
     if (self.state == UIGestureRecognizerStatePossible) { 
      self.state = UIGestureRecognizerStateFailed; 
     } 
    }else{ 
     [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 
      UITouch *touch = (UITouch *)obj; 
      _startingPoint = [touch locationInView:self.view]; 
     }]; 
    } 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 
     UITouch *touch = (UITouch *)obj; 
     CGPoint endPoint = [touch locationInView:self.view]; 
     CGFloat angle = [self angleOfGestureFromPoint:_startingPoint toEndPoint:endPoint]; 

     if (self.state == UIGestureRecognizerStatePossible) { 
      if ([self angleIsWithinDiagonalTolerance:angle] == YES) { 
       if ([self diagonalDistanceFromPoint:_startingPoint toEndPoint:endPoint] >= 20.0f) { 
        self.state = UIGestureRecognizerStateRecognized; 
       } 
      }else{ 
       self.state = UIGestureRecognizerStateFailed; 
      } 
     } 
    }]; 
} 

- (BOOL)angleIsWithinDiagonalTolerance:(CGFloat)angle 
{ 
// NSLog(@"%s",__PRETTY_FUNCTION__); 
    NSAssert1(_tolerance < 45.0f, @"DiagonalSwipeGestureRecognizer Error: tolerance property must be set to a value less than 45.0f. Otherwise, the gesture will be detected at any angle. If you don't care and want the swipe to be recognized at any angle, remove the NSAssert call from - %s.", __PRETTY_FUNCTION__); 
// NSAssert(_tolerance < 45.0f, @"DiagonalSwipeGestureRecognizer Error: tolerance property must be set to a value less than 45.0f. Otherwise, the gesture will be detected at any angle. If you don't care and want the swipe to be recognized at any angle, remove the NSAssert call from -[MMDiagnoalGestureRecognizer angleIsWithinDiagonalTolerance:]."); 

    if (angle >= 45.0f - _tolerance && angle <= 45.0f + _tolerance) { 
     return YES; 
    }else if (angle <= - (45.0f - _tolerance) && angle >= - (45.0f + _tolerance)) { 
     return YES; 
    }else if (angle >= 135.0f - _tolerance && angle <= 135.0f + _tolerance) { 
     return YES; 
    }else if (angle <= - (135.0f - _tolerance) && angle >= - (135.0f + _tolerance)) { 
     return YES; 
    }else{ 
     return NO; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self touchesEnded:touches withEvent:event]; 
    self.state = UIGestureRecognizerStateChanged; 
} 

- (void)reset { 
    //don't call, will be called automatically. 
} 



@end