我正在学习iOS开发,我正在研究UIGestureRecognizer
。
我有一个观点。当您点按该视图时,我想要显示UIPopoverController
,并且我还希望它显示为UIButton
,因为当您按下它时它会“突出显示”。
我认为这样做的方法是使用2 UIGestureRecognizer
- UITapGestureRecognizer
和UILongPressGestureRecognizer
我遇到的问题是立即调用高亮显示方法(我想要),但如果我将手指移动得足够远,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
}
答案 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
。