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



我想禁用屏幕上除了几个特定点(例如按钮)之外的所有区域的触摸。也就是说,当我点击按钮以外的任何东西时,我根本不想触发"触摸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;
    }
}

相关内容

  • 没有找到相关文章

最新更新