在屏幕上抬起1个手指时禁用捏合识别器

jfi*_*isk 1 uigesturerecognizer ios ios5

我有一个2D地图,用户可以使用手势识别器进行缩放和平移.虽然它有效,但我希望用户一旦手指抬起后立即开始平移.不幸的是,在文档中它说:

当两个手指从视图中抬起时,手势结束(UIGestureRecognizerStateEnded).

这是假装我从捏缩放到平移.我该怎么做才能解决这个问题?

NJo*_*nes 5

这是可能的,也很容易!它涉及成为你的手势识别器的代表.似乎没有人知道存在的东西.在我的视图控制器子类中,我声明了符合协议<UIGestureRecognizerDelegate>和两个ivars:

UIPinchGestureRecognizer *myPinchGR;
UIPanGestureRecognizer *myPanGR;
Run Code Online (Sandbox Code Playgroud)

这些ivars在视图中实例化后加载.注意将self设置为委托.

-(void)viewDidLoad{
    [super viewDidLoad];
    myPanGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panTarget:)];
    myPanGR.delegate = self;
    [self.view addGestureRecognizer:myPanGR];

    myPinchGR = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchTarget:)];
    myPinchGR.delegate = self;
    [self.view addGestureRecognizer:myPinchGR];
}
Run Code Online (Sandbox Code Playgroud)

由a做出的委托调用之一UIGestureRecognizer是,shouldRecognizeSimultaneouslyWithGestureRecognizer:如果我有两个以上的手势识别器,那么这个函数必须包含一些逻辑.但是因为只有两个我才能回来YES.

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

现在,您必须在操作方法中包含一些(非常少的)额外逻辑,以筛选适当的条件.

-(void)panTarget:(UIPanGestureRecognizer *)panGR{
    if (panGR.numberOfTouches > 1) return;
    NSLog(@"panny");
}
-(void)pinchTarget:(UIPinchGestureRecognizer *)pinchGR{
    if (pinchGR.numberOfTouches < 2) return;
    NSLog(@"pinchy");
}
Run Code Online (Sandbox Code Playgroud)

运行此代码以查看日志.你会看到当你移动一根手指时,你会看到"panny",当你放下第二根手指时,你会看到"嘶哑",来回.