仅针对特定视图禁用手势识别器
Posted
技术标签:
【中文标题】仅针对特定视图禁用手势识别器【英文标题】:Disable gesture recognizer only for a particular view 【发布时间】:2013-02-08 12:27:38 【问题描述】:在一个视图控制器上,我有一个mainView
。在那个视图中,我有另一个视图 sidePanel
,它的帧为 0,0,86,420。我添加了一个点击手势识别器。现在我只想为 mainView 而不是 sidePanelView 启用手势识别。见下图:
我想为 sidePanelView 禁用 tapGesture 并为除它之外的所有区域启用。我怎样才能做到这一点? (还有一点想说,sidePanelView以外的区域是sidePanelView的parentView)。
【问题讨论】:
【参考方案1】:您应该接受 Bharat 的回答,因为这是正确的。我只想说明你是如何做到的:
将您的视图控制器定义为符合UIGestureRecognizerDelegate
,例如:
@interface ViewController () <UIGestureRecognizerDelegate>
// the rest of your interface
@end
确保为手势设置delegate
:
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleMainTap:)];
gesture.delegate = self;
[self.view addGestureRecognizer:gesture];
然后检查是否对相关视图进行了触摸:
- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
if (CGRectContainsPoint(self.menuView.bounds, [touch locationInView:self.menuView]))
return NO;
return YES;
【讨论】:
如何绑定viewcontroller? 我不明白你的问题。 你写这段代码:self.menuView.bounds,但是我怎么绑定Demomenuviewcontroller -github.com/romaonthego/REFrostedViewController @GamiNilesh - 我建议您发布您自己的问题,向我们展示您如何使用该代码,并给我们一个reproducible example。我完全不清楚您要说什么,所以也许您可以在自己的问题中更详细地描述您的情况,而不是在 cmets 中。【参考方案2】:您可以使用 UIGestureRecognizerDelegate 中的 gestureRecognizer:shouldReceiveTouch: 方法来查看触摸发生的位置并决定是否要响应手势。如果触摸太靠近视图的边缘(您希望禁用 ti 的位置),则返回 NO,否则返回 YES。或者只需检查 touch.view 以查看触摸是否发生在您的 UIImageView 上。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch;
【讨论】:
@RavindraBagale 您是否将手势识别器的delegate
设置为视图控制器?巴拉特的答案是正确的。【参考方案3】:
Swift 3 版本:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool
if theView.bounds.contains(touch.location(in: theView))
return false
return true
【讨论】:
【参考方案4】:遇到了类似的问题;最终使用了@Rob的答案。这是一个 Swift 版本:
extension ViewController: UIGestureRecognizerDelegate
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool
return !CGRectContainsPoint(menuView.bounds, touch.locationInView(menuView))
【讨论】:
【参考方案5】:如果您想为特定视图禁用UITapGestureRecognizer
,只需删除 userInteraction。
前
sidePanel.userInteractionEnabled = NO;
【讨论】:
但我在该视图上有要单击的按钮【参考方案6】:在
的帮助下我做到了-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
并且我已经检查了接触点位置并根据接触位置我做了这样的工作
if(points.x>86)
//hide the side panel
它可以识别手势并与事件同步。
【讨论】:
以上是关于仅针对特定视图禁用手势识别器的主要内容,如果未能解决你的问题,请参考以下文章