我想禁用屏幕上除了几个特定点(例如按钮)之外的所有区域的触摸。也就是说,当我点击按钮以外的任何东西时,我根本不想触发"触摸Began"。调用
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根手指不会触发按钮按下。。。
您需要设置一个不可见的UIButton,并将其放置在不应注册触摸的视图和仍应处于活动状态的UIButton之间。
现在您需要设置不可见按钮的"userInteractionEnabled":
//userInteractionEnabled == NO => self.view registeres touches
//userInteractionEnabled == YES => self.view doesn't register touches
[_invisibleButton setUserInteractionEnabled:NO];
在这个解决方案中真正重要的是,不可见和可见按钮都是VC视图的直接子视图。
你可以从我的dropbox下载一个示例项目:https://dl.dropboxusercontent.com/u/99449487/DontTapThat.zip
然而,这个例子只是阻止了对某些触摸的处理。完全忽略输入在技术上是不可能的:第三方应用程序不负责检测输入。他们只负责处理输入。触摸输入的检测是在iOS上完成的。
建立一个像你在评论中描述的案例的唯一方法是希望iOS不会将你的案例输入解释为"手指",因为它很可能会覆盖比手指大得多的区域。
因此,总之,最好的方法是改变你即将建造的外壳的材料,或者至少给它一层不导电的涂层。从第三方开发人员的角度来看,如果需要如评论中所述的5根手指,那么使用软件是无法实现目标的。
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和其他方法。
谨致问候。
我有一个很好的解决方案。你想隐藏交互的区域在该区域的顶部放置一个透明按钮。
touchesBegan是一个默认方法,所以当视图中发生触摸时,它必须一直调用,所以没有出路,但你仍然可以做一件事设置
self.buttonPlayMusic.userInteractionEnabled = FALSE;
对于你不需要触摸的物体,这可能会帮助你获得想要的输出。
您是否尝试过使用UIScrollView作为背景?即您不希望触发触摸事件的区域。
UIScrollView不调用触摸方法。
您可以在要禁用触摸事件的区域添加UIImageView
控件。您可以将UIImageView
对象添加为self.view
子视图的顶部。
示例//区域——是您想要在self.view
上禁用触摸的区域
UIImageView *imageView=[[UIImageView alloc]initWithFrame:area];
[self.view addSubView:imageView];
您的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;
}
}