禁用iPhone屏幕某些区域的触摸事件

时间:2013-08-29 15:07:42

标签: iphone objective-c input user-input touches

除了特定的几个点(例如按钮)之外,我想禁用屏幕上所有区域的触摸。即当我点击按钮以外的任何东西时,我不希望'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个手指不会触发按下按钮...

7 个答案:

答案 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;
    }
}