关于UIGestureRecognizer

时间:2013-10-16 17:58:12

标签: ios objective-c uigesturerecognizer

我正在学习iOS开发,我正在研究UIGestureRecognizer

我有一个观点。当您点按该视图时,我想要显示UIPopoverController,并且我还希望它显示为UIButton,因为当您按下它时它会“突出显示”。

我认为这样做的方法是使用2 UIGestureRecognizer - UITapGestureRecognizerUILongPressGestureRecognizer

我遇到的问题是立即调用高亮显示方法(我想要),但如果我将手指移动得足够远,UITapGestureRecognizer就会被取消。此时,我想调用另一种方法(unhighlight)来恢复UIView的初始背景颜色,但我对如何执行此操作感到很遗憾。

我对此很陌生,所以这个问题可能是基本的,我感谢任何人都能给我的任何帮助。

UIViewController

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(togglePopover)];

[self.view addGestureRecognizer:tap];

UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(highlight)];
press.minimumPressDuration = 0.f; //highlight immediately
press.delegate = self; //set the delegate to self
[self.view addGestureRecognizer:highlight];


//the delegate part of the UIViewController
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldRecognizeSimultaneouslyWithOtherGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer {
  return YES; //allows allow simultaneous recognition of gestures on this view
}

2 个答案:

答案 0 :(得分:1)

UITapGestureRecognizer具有给定的行为,您刚才在具体案例中对此进行了描述。

您可以使用UIPanGestureRecognizer等连续手势识别器完成所需的操作。

具体来说,连续手势识别器动作方法将根据tge手势识别器通过的状态接收一系列调用。

其中一个状态是UIGestureRecognizerStateCancelled,因此您可以对其进行管理以检测手势何时被取消(如您的情况),并通过删除突出显示来采取相应措施。另一方面,当您在UIGestureRecognizerStateBegan状态下调用您的操作时,您会突出显示该按钮。

你的行动方法是这样的:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {

  if (recognizer.state == UIGestureRecognizerStateBegan) {

     ...
  } else if (recognizer.state == UIGestureRecognizerStateCancelled) {

     ...
  }
}

另一种方法是创建自己的手势识别器子类,您可以在其中处理touchesBegan:/touchesMoved:/touchesEnded:方法以满足您的需求。

如果你看一下UIGestureRecognizer reference,你会发现很多信息。

答案 1 :(得分:0)

如果您想要的行为与UIButton类似,为什么不能只使用UIButton

否则,您必须捕获目标方法内的手势状态。在声明手势识别器的动作目标时,请确保在目标名称后面添加冒号。

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(togglePopover:)];

现在,在-togglePopover内,阅读传递的手势识别器的state属性。 That is documented here。您正在寻找州UIGestureRecognizerStateCancelled