在一个viewController上我有一个mainView,在该视图上我有另一个视图(这被称为sidePanel视图有帧0,0,86,420。)我添加了tapGesture。现在我想只为sidePanelView以外的mainView启用手势识别。 见下图
我想禁用sidePanelView&的tapGesture启用除此之外的区域。怎么做。 (有一点我想说sidePanelView以外的区域是sidePanelView的parentView)。
答案 0 :(得分:25)
你应该接受巴拉特的答案,因为这是正确的。我只想说明你是如何做到的:
将视图控制器定义为符合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;
}
答案 1 :(得分:14)
您可以使用UIGestureRecognizerDelegate中的gestureRecognizer:shouldReceiveTouch:方法查看触摸发生的位置,并决定是否要响应手势。如果触摸距离视图边缘太近(要禁用的位置),则返回NO,否则返回YES。或者只需检查touch.view以查看UIImageView上是否发生了触摸。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldReceiveTouch:(UITouch *)touch;
答案 2 :(得分:7)
Swift 3版本:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
if theView.bounds.contains(touch.location(in: theView)) {
return false
}
return true
}
答案 3 :(得分:4)
陷入类似的问题;最后使用@Rob的答案。这是一个Swift版本:
extension ViewController: UIGestureRecognizerDelegate {
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
return !CGRectContainsPoint(menuView.bounds, touch.locationInView(menuView))
}
}
答案 4 :(得分:3)
如果要为特定视图禁用UITapGestureRecognizer
,只需删除userInteraction。
<强>实施例强>
sidePanel.userInteractionEnabled = NO;
答案 5 :(得分:0)
我在
的帮助下做到了这一点 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
并且我检查了触点位置&amp;根据触摸位置,我做了我的工作
if(points.x>86)
{//hide the side panel
}
它识别与事件同步的手势。