除了特定的几个点(例如按钮)之外,我想禁用屏幕上所有区域的触摸。即当我点击按钮以外的任何东西时,我不希望'touchesBegan'触发。致电
self.view.userInteractionEnabled = NO;
具有未注册触摸所需的效果,但当然我无法点击任何按钮。我基本上希望按钮仍能正常工作,即使触摸屏幕有5个点,即所有触摸输入都已用完,按钮代表第6个。
这可能吗?
我尝试在我的按钮下面插入一个禁用了userInteraction的视图,但是当用户点击屏幕时它仍会记录触摸。似乎禁用触摸注册的唯一方法是在整个屏幕上(在父UIView上)这样做。
更新: 我尝试使用手势识别器来处理所有触摸事件,并忽略那些不符合条件的事件。这是我的代码:
@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
...
- (void)viewDidLoad
{
[super viewDidLoad];
UIGestureRecognizer *allRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:nil];
allRecognizer.delegate = self;
[self.view addGestureRecognizer:allRecognizer];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
CGPoint coords = [touch locationInView:self.view];
NSLog(@"Coords: %g, %g", coords.x, coords.y);
if (coords.y < 200) {
[self ignoreTouch:touch forEvent:nil];
return TRUE;
}
return FALSE;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"%i touch(es)", [touches count]);
}
然而屏幕仍然“读取”触摸,所以如果我放下5个手指,第6个手指不会触发按下按钮...
答案 0 :(得分:8)
您需要设置一个不可见的UIButton,并将其放置在不应注册触摸的视图和应该仍处于活动状态的UIButton之间。
现在你需要设置隐形按钮的'userInteractionEnabled':
//userInteractionEnabled == NO => self.view registeres touches
//userInteractionEnabled == YES => self.view doesn't register touches
[_invisibleButton setUserInteractionEnabled:NO];
在这个解决方案中真正重要的是,无形和可见按钮都是VC视图的直接子视图。
您可以从我的保管箱下载示例项目: https://dl.dropboxusercontent.com/u/99449487/DontTapThat.zip
然而,此示例仅阻止处理某些触摸。完全忽略输入在技术上是不可能的:第三方应用程序不负责检测输入。他们只负责处理输入。触摸输入的检测是在iOS上完成的。
建立像你在评论中描述的案例的唯一方法是希望iOS不会将你的案例输入解释为“手指”,因为它最有可能覆盖一个大于一根手指。
因此,总之,最好的方法是改变您即将建造的箱子的材料,或者至少给它一个非导电涂层。从第三方开发人员的角度来看,如果评论中描述的需要5个手指,则无法通过软件实现目标。
答案 1 :(得分:3)
UIView中有几种方法可以覆盖:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; // default returns YES if point is in bounds
这应该可以防止调用touchBegin和其他方法。
问候。
答案 2 :(得分:0)
我有一个很好的解决方案。您希望隐藏交互的区域在该区域的顶部放置一个透明按钮。
答案 3 :(得分:0)
touchesBegan是一种默认方法,所以当视图上发生触摸时它必须一直调用,所以没有出路,但你仍然可以做一件事
self.buttonPlayMusic.userInteractionEnabled = FALSE;
对于您不需要触摸的对象,这可能会帮助您获得所需的输出。
答案 4 :(得分:0)
您可以在要禁用触摸事件的区域添加UIImageView
控件。您可以将UIImageView
对象添加为self.view
子视图的顶部。
实施例
// area - 是您要在self.view
UIImageView *imageView=[[UIImageView alloc]initWithFrame:area];
[self.view addSubView:imageView];
答案 5 :(得分:0)
您是否尝试过使用UIScrollView作为背景?即您不希望触发事件的区域。
UIScrollView不会调用触摸方法。
答案 6 :(得分:0)
你touchDelegate总会以这种方式打电话,但如果你正在做一些触摸任务,那么你就可以这样做了。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
UIButton *touchObject=(UIButton*)[touch view];
if ([touchObject isKindOfClass:[UIButton class]])
{
//Do what ever you want on button touch
}
else{
return;
}
}