呈现模式视图控制器时呈现视图控制器响应触摸事件

Posted

技术标签:

【中文标题】呈现模式视图控制器时呈现视图控制器响应触摸事件【英文标题】:Presenting view controller response touch events when modal view controller is presented 【发布时间】:2014-08-01 11:38:27 【问题描述】:

代码如下:

UIStoryboard *myStoryboard = [UIStoryboard storyboardWithName:@"StoryboardName" bundle:nil];
UIViewController *presentedViewController = [myStoryboard instantiateViewControllerWithIdentifier:@"IdentifierName"];
presentedViewController.modalPresentationStyle = UIModalPresentationFormSheet;

presentingViewController presentViewController:presentedViewController animated:NO completion:nil];

presentingViewController 的视图不会响应任何触摸事件,但我希望它接受触摸事件,我该怎么办?感谢您的任何建议!

【问题讨论】:

【参考方案1】:

这是预期的行为,应该是您在大多数应用中看到的。然而,Apple 的 App Store 应用程序确实允许您在模式表单之外点击以将其关闭,因此有一些先例可以以有限的方式接受它。如果您的设计绝对需要它,请考虑在呈现的视图控制器中设置和拆除基于窗口的手势识别器。

例如,要实现点击外部关闭行为,请在viewDidAppear: 中配置点击手势识别器。如果在调用时它仍然存在,您可以在 viewWillDisappear: 上将其删除。

在点击处理程序中,您希望在窗口坐标中获取点击的位置,即:

CGPoint tapPoint = [recognizer locationInView:nil];

然后,您可以对几何图形进行一些操作,以检查点击是否发生在模态呈现的视图上或外部(在与您的呈现视图控制器对应的变暗区域上)。 UIView 有一个pointInside:withEvent: 方法可能会对此有所帮助。

【讨论】:

感谢您的回复,但我很困惑我应该在哪个视图中覆盖 pointInside:withEvent: 方法,以及我应该在这个方法中做什么 在点击识别器中,一旦你有了点击位置,你可以调用 [self.view pointInside:tapPoint withEvent:nil] 来查看点击是发生在模态视图上还是在它外面。在使用 pointInside:withEvent 进行测试之前,您可能需要使用 convertPoint:fromView 将 tapPoint 从窗口坐标转换为模态视图的坐标。 对不起,我还是不明白你的意思,点击识别器是模态视图添加的,所以只有在模态视图中才能识别点击识别器,这意味着它使没有意义调用 [self.view pointInside:tapPoint withEvent:nil] 当然在self.view.window中添加了tap识别器,我之前弄错了。然后判断水龙头是在模态视图上还是在外面,你是对的,问题解决了。非常感谢,你是救命稻草。【参考方案2】:

这是呈现视图控制器的简单方法...

  ViewController *view = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
  [self presentViewController:view animated:YES completion:nil];

享受代码

【讨论】:

我认为你没有完全理解我的意思 这只是启动模态视图。这两行将不允许在演示视图控制器上进行触摸响应。只需显示覆盖的模态视图。 bhoomi-thummar 您应该自行删除此解决方案。

以上是关于呈现模式视图控制器时呈现视图控制器响应触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 3D 触摸窥视动作的预览动作中访问呈现视图控制器?

在视图控制器演示动画期间响应触摸事件

视图控制器演示 Swift 3

从应用程序中的故事板手动创建的视图控制器:didFinishLaunching 不响应触摸事件

通过 UIViewController 传递触摸

UITextField 是不是消耗触摸事件?