Bạn có thể giải quyết vấn đề này bằng cách thực hiện tùy chỉnh PanGestureRecognizer
giúp lưu điểm tiếp xúc ban đầu và cung cấp cho người gọi.
Tôi đã đi tuyến đường này vì tôi cũng muốn kiểm soát khoảng cách được di chuyển để kích hoạt cử chỉ xoay .
Điều này có thể quá mức cần thiết cho hoàn cảnh của bạn, nhưng hoạt động hoàn hảo và ít khó hơn âm thanh.
Để có được tọa độ điểm tương tác, bạn chỉ cần gọi:
[sender touchPointInView:yourView]
thay vì:
[sender locationInView:yourView]
Dưới đây là các mã cho PanGestureRecognizer.m
:
#import "PanGestureRecognizer.h"
#import <UIKit/UIGestureRecognizerSubclass.h>
@implementation PanGestureRecognizer
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
// touchPoint is defined as: @property (assign,nonatomic) CGPoint touchPoint;
self.touchPoint = [touch locationInView:nil];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGPoint p = [touch locationInView:nil];
// customize the pan distance threshold
CGFloat dx = fabs(p.x-self.touchPoint.x);
CGFloat dy = fabs(p.y-self.touchPoint.y);
if (dx > 2 || dy > 2) {
if (self.state == UIGestureRecognizerStatePossible) {
[self setState:UIGestureRecognizerStateBegan];
}
else {
[self setState:UIGestureRecognizerStateChanged];
}
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
if (self.state == UIGestureRecognizerStateChanged) {
[self setState:UIGestureRecognizerStateEnded];
}
else {
[self setState:UIGestureRecognizerStateCancelled];
}
}
- (void) reset
{
}
// this returns the original touch point
- (CGPoint) touchPointInView:(UIView *)view
{
CGPoint p = [view convertPoint:self.touchPoint fromView:nil];
return p;
}
@end
Liên kết này có thể giúp - http://www.icodeblog.com/2010/10/14/working-with-uigesturerecognizers/ – Coffee