在一个视图控制器上,我有一个mainView
. 在那个视图上,我有另一个视图 ,sidePanel
它的帧为 0,0,86,420。我添加了一个点击手势识别器。现在我只想为 mainView 而不是 sidePanelView 启用手势识别。见下图:
我想为 sidePanelView 禁用 tapGesture 并为除它之外的所有区域启用。我怎样才能做到这一点?(还有一点我想说,sidePanelView 以外的区域是sidePanelView 的parentView)。
在一个视图控制器上,我有一个mainView
. 在那个视图上,我有另一个视图 ,sidePanel
它的帧为 0,0,86,420。我添加了一个点击手势识别器。现在我只想为 mainView 而不是 sidePanelView 启用手势识别。见下图:
我想为 sidePanelView 禁用 tapGesture 并为除它之外的所有区域启用。我怎样才能做到这一点?(还有一点我想说,sidePanelView 以外的区域是sidePanelView 的parentView)。
您应该接受 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;
}
您可以使用 UIGestureRecognizerDelegate 中的 gestureRecognizer:shouldReceiveTouch: 方法来查看触摸发生的位置并决定是否要响应手势。如果触摸太靠近视图的边缘(您希望禁用 ti 的位置),则返回 NO,否则返回 YES。或者简单地检查 touch.view 以查看触摸是否发生在您的 UIImageView 上。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch;
斯威夫特 3 版本:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if theView.bounds.contains(touch.location(in: theView)) {
return false
}
return true
}
遇到类似的问题;最终使用了@Rob的答案。这是一个 Swift 版本:
extension ViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
return !CGRectContainsPoint(menuView.bounds, touch.locationInView(menuView))
}
}
如果要禁用UITapGestureRecognizer
特定视图,只需删除 userInteraction。
前任
sidePanel.userInteractionEnabled = NO;
我已经做到了,在帮助下
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
并且我已经检查了触摸点位置并根据触摸位置我做了这样的工作
if(points.x>86)
{//hide the side panel
}
它通过与事件同步来识别手势。