touchesBegan 不能在 iOS 中的 UIView 上工作?

Posted

技术标签:

【中文标题】touchesBegan 不能在 iOS 中的 UIView 上工作?【英文标题】:touchesBegan not working on UIView in iOS? 【发布时间】:2016-10-15 05:58:36 【问题描述】:

我已经像这样在按钮单击时以编程方式创建了一个 UIView

self.paintView=[[UIView alloc]initWithFrame:CGRectMake(0, 0,self.view.frame.size.width,self.view.frame.size.height+100)];
[self.paintView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]];
[self.navigationController.view addSubview:self.paintView];

并将其添加到navigationController,以便我可以全屏查看我的 UIView。

但是当我尝试检测触摸时它不起作用

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    UITouch *touch = [touches anyObject];
    if (touch.view==self.paintView && self.paintView ) 
        [UIView animateWithDuration:0.9 animations:^
          [self.sideView setFrame:CGRectMake(-290, 0, self.sideView.frame.size.width, self.sideView.frame.size.height)];
     ];
    


这个方法现在根本检测不到。

【问题讨论】:

那是因为你用代码创建的一些新视图阻塞了父视图,touches 方法属于父视图但它无法检测到它,因为子视图。跨度> 【参考方案1】:

你可以试试下面的代码来添加视图和检查吗:

self.paintView=[[UIView alloc]initWithFrame:CGRectMake(0, 0,self.view.frame.size.width,self.view.frame.size.height+100)];

[self.paintView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5]];


[self.window.rootViewController.view addSubview:self.paintView];//try this

由通用UIViewController 创建的视图会填满窗口并位于您的SubView 前面。因此您的SubView 无法接收到触摸。

rootViewController.view 成为您窗口中的单个***视图,并在其下添加子视图并检查。

【讨论】:

【参考方案2】:

如果在视图的所有超级视图上启用了“userInteractionEnabled”NOT,就会发生这种情况。如果任何超级视图将此属性设置为 false,则不会为它们或它们的任何子视图处理触摸事件。检查这是否是问题所在。

【讨论】:

【参考方案3】:

在所有超级视图上启用 userInteractionEnabled。如果superviews将此属性设置为false,则子views不会处理触摸。

您也可以使用 UITapGestureRecognizer。

【讨论】:

【参考方案4】:

并给你UIView UserInteractionEnable = YES

用我的代码替换你的-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 代码。

CGPoint point = [touch locationInView:touch.view];
 CGPoint pointOnScreen = [touch.view convertPoint:point toView:nil];
 NSLog(@"Point - %f, %f", pointOnScreen.x, pointOnScreen.y);
 NSLog(@"Touch");

【讨论】:

以上是关于touchesBegan 不能在 iOS 中的 UIView 上工作?的主要内容,如果未能解决你的问题,请参考以下文章

检测用户是不是在 iOS 上触摸过屏幕

静态 tableView 中的 touchesBegan 未被调用

iOS Touchesbegan 后续触摸仅在第一次触摸移动时到达

touchesBegan,如何获得所有的接触,而不仅仅是第一次或最后一次?

iOS 9.3 touchesBegan/Ended 未在模拟器中触发

ios touchesBegan 未在 arm64 设备上调用