如何协调两个UIGestureRecognizer的行为?

时间:2011-02-07 18:43:50

标签: ios uigesturerecognizer

我已将平移和捏合手势附加到视图中。我想协调它们,以便当每个完成“UIGestureRecognizerStateChanged”状态的一个循环时,我想采取协调的动作来聚合来自每个的更新信息。具体来说,我的平移控制翻译和我的捏控制比例。我想在一个地方进行平移和缩放的增量矩阵连接,而不是每个都自动连接,这会导致令人不快的阶梯式移动。

我已经盯着UIGestureRecognizerDelegate文档,但看不到让它做我想做的事。

谢谢,
道格

1 个答案:

答案 0 :(得分:0)

首先要做的是确保识别器“同时”工作。在您的委托中,您需要定义以下内容:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{        
    return (gestureRecognizer.view == otherGestureRecognizer.view);
}

根据我的经验,这足以提供足够顺畅的体验。但是,如果不是,那么我要做的就是只更新一个识别器的转换,将状态存储在另一个属性中。假设您已经声明了一个名为cachedScale的CGFloat属性,您在初始化程序中将其设置为1.0。然后在你的捏合和平移处理程序中,你将执行以下操作:

- (IBAction)handlePinch:(UIPinchGestureRecognizer *)recognizer
{    
    self.cachedScale *= recognizer.scale;
}

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer
{
    CGAffineTransform transform = CGAffineTransformMakeScale(self.cachedScale, self.cachedScale);
    self.cachedScale = 1.0;

    CGPoint translation = [recognizer translationInView:recognizer.view.superview];
    CGAffineTransformTranslate(transform, translation.x, translation.y);

    // do something with your transform
}

如果你只是试图拖动一个视图,你可能会更幸运地改变视图的中心,而不是将转换应用到它的转换。