5

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

4

7 回答 7

8

您需要设置一个不可见的 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 个手指,如评论中所述,则无法通过软件实现您的目标。

于 2013-09-03T16:07:20.743 回答
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 和其他方法。

问候。

于 2013-09-05T09:01:21.577 回答
0

我有一个很好的解决方案。您想要隐藏交互的任何区域都在该区域顶部放置一个透明按钮。

于 2013-08-30T09:43:12.380 回答
0

touchesBegan 是一个默认方法,所以当触摸发生在视图上时它必须一直调用,所以没有出路,但你仍然可以做一件事

self.buttonPlayMusic.userInteractionEnabled = FALSE; 

对于您不需要触摸的对象,这可能会帮助您获得所需的输出。

于 2013-09-03T10:50:41.140 回答
0

您可以UIImageView在要禁用触摸事件的区域上添加控件。您可以将UIImageView对象添加为子视图的顶部self.view

示例 //area -- 是您要禁用触摸的区域self.view

UIImageView *imageView=[[UIImageView alloc]initWithFrame:area];

[self.view addSubView:imageView];
于 2013-09-03T10:57:04.257 回答
0

您是否尝试过使用 UIScrollView 作为背景?即您不希望触发触摸事件的区域。

UIScrollView 不调用触摸方法。

于 2013-09-04T07:42:44.197 回答
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;
    }
}
于 2013-09-09T12:32:58.917 回答